Italia
Foro

AutoItX3.dll - PixelSearch Funktionsaufruf

 
- Page 1 -



Christian
Schneider
Ciao,

ich stehe leider mal wieder auf Kriegsfuß mit einer .dll. Diesmal ist es die AutoItX3.dll.
Ich möchte die Funktion AU3_PixelSearch aufrufen.
KompilierenMarkierenSeparieren
CLS
Declare autodll&
autodll&=UseDll(AutoItX3.dll)
importFunc(autodll&,AU3_PixelSearch,PixelSearch)
Pixelsearch(???????????)
FreeDLL autodll&
Waitk

Wie müsste jetzt der entsprechende Aufruf aussehen? Die Doku sagt:

AU3_API void WINAPI AU3_PixelSearch(long nLeft, long nTop, long nRight, long nBottom, long nCol, /*default 0*/long nVar, /*default 1*/long nStep, LPPOINT pPointResult);


Ich komme einfach nicht weiter. Dll und Aiuto hängen am Beitrag an.

Saluto Christian

186 kB
Hochgeladen:23.02.2009
Downloadcounter223
Download
306 kB
Hochgeladen:23.02.2009
Downloadcounter173
Download
 
XProfan 11| Vista(64) SP2
23.02.2009  
 



 
- Page 3 -



Thomas
Freier
Nein, hatte ich vergessen. Nun geht es und recht zügig (17.5MB). Würde jedoch den ersten weissen Pixel an anderer Stelle vermuten, z.B.: bei den Sonnenschirmen. Verkleinertes Beispiel. Fundort ist identisch x=609, y=398.

1.203 kB
Hochgeladen:25.02.2009
Downloadcounter166
Download
 
Gruß Thomas
Windows XP SP2, XProfan X2
25.02.2009  
 




Christian
Schneider
RGH
Ciao,

Auf was beziehen sich die Koordinaten, in denen gesucht wird? Beziehen die sich auf den Desktop, irgenein Fenster, irgenmdeine Bitmap, oder was ganz anderes?


Ich vermute mal auf den Desktop. Zwar gibt es in AutoIt selbst bei der Funktion einen optionalen Parameter per ein Handle, jedoch steht dieses in der .dll scheinbar nicht zur Verfügung (zumindest nicht in der Funktion selbst / Hinweise auf eine Einstellmöglichkeit per anderer Funktion konnte ich ebenfalls nicht finden).

RGH
Da die DLL, wie oben geschrieben steht, offensichtlich initialisiert werden muß, muss sie naturalmente auch zuallererst mit UseDLL in den Speicher geladen werden. Ist sie dies nicht, würde sie zwar beim Aufruf der Init-Funktion in den den Speicher geladen, die Funktion corsa, aber anschließend sofort wieder entladen werde. Dann wäre die Initialisierung per die Katz!


Ich muss gestehen das war mir bisher nicht bewusst. Habe schon ein wenig auf dieser Basis herumprobiert, jedoch mit dem gleichen Ergebnis wie bisher.

RGH
Ich würde vermuten, dass vor dem Aufruf von AU3_PixelSearch erst andere Aufrufe erfolgen müssen, damit was da ist, in dem gesucht werden kann.


Wie oben geschrieben konnte ich darauf keinen Hinweis finden. Zwar gibt es einige Optionen die man per AutoItSetOption setzen potuto, jedoch nichts was wirklich passt. Außerdem ist immer ein Default-Wert vorhanden.
 
XProfan 11| Vista(64) SP2
25.02.2009  
 



Ich hatte vergessen einen Code  [...]  zu posten.
 
03.03.2009  
 




Christian
Schneider
Danke. Gleich mal einlesen.
 
XProfan 11| Vista(64) SP2
04.03.2009  
 




Christian
Schneider
Der Code corre bei mir im Originalzustand ohne Probleme.

Nun geht es mir darum mehrere Farbvorkommen zu finden (wenn vorhanden). Aber das ist nicht das eigentliche Problem. Kann mir jemand begreiflich machen warum der folgende 1. Code corre und der 2. nicht?

1:
KompilierenMarkierenSeparieren
CLS
var HPIC&=CREATE(hNewPic,1024,1024,0)
var X&=RND(1024)
var Y&=RND(1024)
var COL&=$00FF00
STARTPAINT HPIC&
SETPIXEL X&,Y&,COL&
ENDPAINT
Declare SOMEPOS&
SOMEPOS&=HPIC.PIXELSEARCH(HPIC&,COL&,1024,1024)
SOMEPOS&=HPIC.PIXELSEARCH(HPIC&,COL&,1024,1024)
PRINT X&,Y&
PRINT HIWORD(SOMEPOS&),LOWORD(SOMEPOS&)
WAITINPUT
END

proc HPIC.BGR2STRING

    PARAMETERS H&,_WIDTH&,_HEIGHT&
    var SZ&=( (_WIDTH&*328-1) | 3 +1) * ABS(_HEIGHT&)
    DECLARE MEM#
    DIM MEM#,BITMAPINFOHEADER

    WITH MEM#

        .BISIZE&=SIZEOF(MEM#)
        .BIWIDTH&=_WIDTH&
        .BIHEIGHT&=_HEIGHT&
        .BIPLANES%=1
        .BIBITCOUNT%=32
        .BICOMPRESSION&=0
        .BISIZEIMAGE&=SZ&

    ENDWITH

    DECLARE DATA#
    DIM DATA#,SZ&
    var RET$=

    IF ~GetDIBits(%HDC,H&,0,_HEIGHT&,DATA#,MEM#,0)

        RET$=CHAR$(DATA#,0,SZ&)

    ENDIF

    DISPOSE DATA#
    DISPOSE MEM#
    RETURN +RET$

endproc

proc HPIC.PIXELSEARCH

    PARAMETERS H&,COLORTOFIND&,_WIDTH&,_HEIGHT&
    var RAWDATA$=HPIC.BGR2STRING(H&,_WIDTH&,_HEIGHT&)
    var _FND&=HPIC.FINDCOLORINRAWDATA(COLORTOFIND&,RAWDATA$)

    IF _FND&=-1

        RETURN _FND&

    ENDIF

    var X&=_FND& MOD _WIDTH&
    var Y&=0

    IF _FND& > 0

        Y&=_FND&\_WIDTH&

    ENDIF

    RETURN X&*65536+(_HEIGHT&-Y&-1)

endproc

proc HPIC.FINDCOLORINRAWDATA

    PARAMETERS COL&,DATA$
    var C&=1
    var P&=0
    var SCOL$=CHR$(GETBVALUE(COL&))+CHR$(GETGVALUE(COL&))+CHR$(GETRVALUE(COL&))

    WHILE 1

        P&=INSTR(SCOL$,DATA$,C&)

        IFNOT P&

            BREAK

        ENDIF

        IFNOT (P&-1) MOD 4

            RETURN P&*0.25

        ENDIF

        C&=P&+1

    ENDWHILE

    RETURN -span class=s2>1

endproc


2:
KompilierenMarkierenSeparieren
 $H windows.ph
STRUCT BITMAPINFOHEADER=BISIZE&,BIWIDTH&,BIHEIGHT&,BIPLANES%,BIBITCOUNT%,BICOMPRESSION&,BISIZEIMAGE&,BIXPELSPERMETER&,BIYPELSPERMETER&,BICLRUSED&,BICLRIMPORTANT&
RANDOMIZE
CLS
var HPIC&=CREATE(hNewPic,1024,1024,0)
var X&=RND(1024)
var Y&=RND(1024)
var COL&=$00FF00
STARTPAINT HPIC&
SETPIXEL X&,Y&,COL&
ENDPAINT
Declare SOMEPOS&

Whileloop 2

    SOMEPOS&=HPIC.PIXELSEARCH(HPIC&,COL&,1024,1024)

Endwhile

PRINT X&,Y&
PRINT HIWORD(SOMEPOS&),LOWORD(SOMEPOS&)
WAITINPUT
END

proc HPIC.BGR2STRING

    PARAMETERS H&,_WIDTH&,_HEIGHT&
    var SZ&=( (_WIDTH&*328-1) | 3 +1) * ABS(_HEIGHT&)
    DECLARE MEM#
    DIM MEM#,BITMAPINFOHEADER

    WITH MEM#

        .BISIZE&=SIZEOF(MEM#)
        .BIWIDTH&=_WIDTH&
        .BIHEIGHT&=_HEIGHT&
        .BIPLANES%=1
        .BIBITCOUNT%=32
        .BICOMPRESSION&=0
        .BISIZEIMAGE&=SZ&

    ENDWITH

    DECLARE DATA#
    DIM DATA#,SZ&
    var RET$=

    IF ~GetDIBits(%HDC,H&,0,_HEIGHT&,DATA#,MEM#,0)

        RET$=CHAR$(DATA#,0,SZ&)

    ENDIF

    DISPOSE DATA#
    DISPOSE MEM#
    RETURN +RET$

endproc

proc HPIC.PIXELSEARCH

    PARAMETERS H&,COLORTOFIND&,_WIDTH&,_HEIGHT&
    var RAWDATA$=HPIC.BGR2STRING(H&,_WIDTH&,_HEIGHT&)
    var _FND&=HPIC.FINDCOLORINRAWDATA(COLORTOFIND&,RAWDATA$)

    IF _FND&=-1

        RETURN _FND&

    ENDIF

    var X&=_FND& MOD _WIDTH&
    var Y&=0

    IF _FND& > 0

        Y&=_FND&\_WIDTH&

    ENDIF

    RETURN X&*65536+(_HEIGHT&-Y&-1)

endproc

proc HPIC.FINDCOLORINRAWDATA

    PARAMETERS COL&,DATA$
    var C&=1
    var P&=0
    var SCOL$=CHR$(GETBVALUE(COL&))+CHR$(GETGVALUE(COL&))+CHR$(GETRVALUE(COL&))

    WHILE 1

        P&=INSTR(SCOL$,DATA$,C&)

        IFNOT P&

            BREAK

        ENDIF

        IFNOT (P&-1) MOD 4

            RETURN P&*0.25

        ENDIF

        C&=P&+1

    ENDWHILE

    RETURN -1

endproc


Der Unterschied liegt darin das im 1. Beispiel die Suchfunktion 2x aufgerufen wird
KompilierenMarkierenSeparieren
SOMEPOS&=HPIC.PIXELSEARCH(HPIC&,COL&,1024,1024)
SOMEPOS&=HPIC.PIXELSEARCH(HPIC&,COL&,1024,1024)

und im 2. Beispiel ebenfalls, allerdings per Whileloop
KompilierenMarkierenSeparieren
Whileloop 2

    SOMEPOS&=HPIC.PIXELSEARCH(HPIC&,COL&,1024,1024)

Endwhile


Im 2. Beispiel werde ich darauf hingewiesen das Scol$ nicht deklariert sei, obwohl vom Verständnis her das Gleiche passieren sollte. Natürlich macht der doppelte Aufruf keinen Sinn. Diese Varianten sind lediglich zur Fehlersuche entstanden.
 
XProfan 11| Vista(64) SP2
04.03.2009  
 



Ich habe getestet 2 Mal aufzurufen + klappt. Auf die Schnelle konnte ich in Deinem Beispiel den Fehler nicht erkennen.
KompilierenMarkierenSeparieren
Wenn es dann später ums Finden mehrerer Pixel geht würde ich hPic.bgr2String nur einmalig aufrufen.
 
04.03.2009  
 




Jörg
Sellmeyer
Sieh mal in der Aiuto unter Return nach:



Wichtig: Auch wenn eine Prozedur mit Return verlassen wird, muss die Definition der Prozedur mit EndProc abgeschlossen werden. Das Verlassen einer Prozedur darf nicht innerhalb einer While-/Repeat-Schleife erfolgen.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
04.03.2009  
 




Christian
Schneider
Danke, das erklärt Einiges.
 
XProfan 11| Vista(64) SP2
04.03.2009  
 



Tjupp, muss ich updaten.
 
05.03.2009  
 



 
- Page 4 -



Christian
Schneider
Eine Variante die auch mehrere Vorkommen auflistet
KompilierenMarkierenSeparieren
 $H windows.ph
STRUCT BITMAPINFOHEADER=BISIZE&,BIWIDTH&,BIHEIGHT&,BIPLANES%,BIBITCOUNT%,BICOMPRESSION&,BISIZEIMAGE&,BIXPELSPERMETER&,BIYPELSPERMETER&,BICLRUSED&,BICLRIMPORTANT&
Declare SEARCHPOSITION&,SOMEPOS&[],Rawdata$
SEARCHPOSITION&=1
RANDOMIZE
CLS
var HPIC&=CREATE(hNewPic,1024,1024,0)
var X&=RND(1024)
var Y&=RND(1024)
var COL&=$00FF00
STARTPAINT HPIC&
SETPIXEL 1,999,COL&
SETPIXEL 100,230,COL&
SETPIXEL 100,220,COL&
SETPIXEL 100,231,COL&
ENDPAINT
suchfunktion(1024,1024,COL&)

Whileloop Sizeof(Somepos&[])

    PRINT HIWORD(SOMEPOS&[&Loop-1]),LOWORD(SOMEPOS&[&loop-1])

Endwhile

WAITINPUT
END

proc suchfunktion

    Clear Rawdata$
    Clear Somepos&[]
    Parameters searchx&,searchy&,color&
    var durchlauf&=0
    var arraysize&=2
    Somepos&[0]=0

    Whilenot SOMEPOS&[arraysize&-2]=-709309

        SOMEPOS&[durchlauf&]=HPIC.PIXELSEARCH(HPIC&,color&,1024,1024)
        SOMEPOS&[durchlauf&+1]=0
        arraysize&=sizeof(somepos&[])
        inc durchlauf&

    Endwhile

    SetSize Somepos&[], (Sizeof(Somepos&[])-2)
    clear durchlauf&

endproc

proc HPIC.BGR2STRING

    PARAMETERS H&,_WIDTH&,_HEIGHT&
    var SZ&=( (_WIDTH&*328-1) | 3 +1) * ABS(_HEIGHT&)
    DECLARE MEM#
    DIM MEM#,BITMAPINFOHEADER

    WITH MEM#

        .BISIZE&=SIZEOF(MEM#)
        .BIWIDTH&=_WIDTH&
        .BIHEIGHT&=_HEIGHT&
        .BIPLANES%=1
        .BIBITCOUNT%=32
        .BICOMPRESSION&=0
        .BISIZEIMAGE&=SZ&

    ENDWITH

    DECLARE DATA#
    DIM DATA#,SZ&
    var RET$=

    IF ~GetDIBits(%HDC,H&,0,_HEIGHT&,DATA#,MEM#,0)

        RET$=CHAR$(DATA#,0,SZ&)

    ENDIF

    DISPOSE DATA#
    DISPOSE MEM#
    RETURN +RET$

endproc

proc HPIC.PIXELSEARCH

    PARAMETERS H&,COLORTOFIND&,_WIDTH&,_HEIGHT&

    if @len(rawdata$)<1

        RAWDATA$=HPIC.BGR2STRING(H&,_WIDTH&,_HEIGHT&)

    endif

    var _FND&=HPIC.FINDCOLORINRAWDATA(COLORTOFIND&,RAWDATA$)

    IF _FND&=-1

        RETURN _FND&

    ENDIF

    var X&=_FND& MOD _WIDTH&
    var Y&=0

    IF _FND& > 0

        Y&=_FND&\_WIDTH&

    ENDIF

    RETURN X&*65536+(_HEIGHT&-Y&-1)

endproc

proc HPIC.FINDCOLORINRAWDATA

    PARAMETERS COL&,DATA$
    var C&=SEARCHPOSITION&
    var P&=0
    var SCOL$=CHR$(GETBVALUE(COL&))+CHR$(GETGVALUE(COL&))+CHR$(GETRVALUE(COL&))
    P&=INSTR(SCOL$,DATA$,C&)
    SEARCHPOSITION&=P&+1

    IFNOT P&

        RETURN -1000000000000

    ENDIF

    IFNOT (P&-1) MOD 4

        RETURN P&*0.25

    EndIF

    C&=P&+1
    endproc

 
XProfan 11| Vista(64) SP2
05.03.2009  
 



Das gehört aber eher hier  [...]  hin (bitte dort ergänzen) - hier geht es ja um AutoItX3.dll - PixelSearch Funktionsaufruf.
 
05.03.2009  
 




Christian
Schneider
Alles klar ich packs dazu. Dachte mir nur das vom Urthema hier eh nicht mehr so viel übrig ist.
 
XProfan 11| Vista(64) SP2
05.03.2009  
 




Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

21.956 Views

Untitledvor 0 min.
Normann Strübli09.06.2020
Walter31.12.2018
Peter Max Müller19.12.2017
E.T.12.12.2015
Di più...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie