Deutsch
Forum

AutoItX3.dll - PixelSearch Funktionsaufruf

 
- Seite 1 -



Christian
Schneider
Hallo,

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&
Waitkey

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 Hilfe hängen am Beitrag an.

Gruß Christian

186 kB
Hochgeladen:23.02.2009
Ladeanzahl223
Herunterladen
306 kB
Hochgeladen:23.02.2009
Ladeanzahl173
Herunterladen
 
XProfan 11| Vista(64) SP2
23.02.2009  
 



 
- Seite 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
Ladeanzahl166
Herunterladen
 
Gruß Thomas
Windows XP SP2, XProfan X2
25.02.2009  
 




Christian
Schneider
RGH
Hallo,

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 für 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 natürlich 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 ausgeführt, aber anschließend sofort wieder entladen werde. Dann wäre die Initialisierung für 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 könnte, 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 läuft 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 läuft 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 -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 Hilfe 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  
 



 
- Seite 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
    RETURN -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  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

21.959 Betrachtungen

Unbenanntvor 0 min.
Normann Strübli09.06.2020
Walter31.12.2018
Peter Max Müller19.12.2017
E.T.12.12.2015
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


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