| |
|
|
- 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 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 |
|
|
| |
|
|
| |
|
- Page 3 - |
|
|
| Die Doku die ich dazu fand beinhaltete lediglich den bereits oben einkopierten Aufruf mit Parametern - habe nichts so recht gefunden und deswegen auch die Lösung mit reinem XProfan erstellt. (Welche deutlich schneller als die DLL arbeiten sollte/potuto.) |
|
|
| |
|
|
|
Thomas Freier | Bei mir beendet die pixelSearch.exe sich gleich beim Starten. |
|
|
| |
|
|
|
| Ein SS.BMP liegt im Pfad? |
|
|
| |
|
|
|
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. |
|
|
| |
|
|
|
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. |
|
|
| |
|
|
|
| Ich hatte vergessen einen Code [...] zu posten. |
|
|
| |
|
|
|
Christian Schneider | Danke. Gleich mal einlesen. |
|
|
| |
|
|
|
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: KompilierenMarkierenSeparierenCLS
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 und im 2. Beispiel ebenfalls, allerdings per Whileloop KompilierenMarkierenSeparieren 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. |
|
|
| |
|
|
|
| Ich habe getestet 2 Mal aufzurufen + klappt. Auf die Schnelle konnte ich in Deinem Beispiel den Fehler nicht erkennen. KompilierenMarkierenSeparieren {$cleq}
{$runtime c:xprofan11}
randomize
const xx=1024
const yy=1024
cls
long hPic=create(hNewPic,xx,yy,0)
long x=rnd(xx),y=rnd(yy)
long col=$00FF00
startPaint hPic
setPixel x,y,col
endPaint
long somePos=hPic.PixelSearch(hPic,col,xx,yy)
print x,y
print hiWord(somePos),loWord(somePos)
x=rnd(xx)
y=rnd(yy)
startPaint hPic
cls
setPixel x,y,col
endPaint
somePos=hPic.PixelSearch(hPic,col,xx,yy)
locate 3,1
print x,y
print hiWord(somePos),loWord(somePos)
waitInput
end
string hPic.bgr2String(long h,_width,_height){
long sz=( (_width*328-1) | 3 +1) * abs(_height)
mem mem=bitmapInfoHeader
with mem
.biSize& = sizeof(mem)
.biWidth& = _width
.biHeight& = _height
.biPlanes% = 1
.biBitCount% = 32
.biCompression& = BI_RGB
.biSizeImage& = sz
endwith
mem data=sz
string ret=error
case ~getDIBits(hDC,h,,_height,data,mem,) : ret=char$(data,0,sz)
dispose data
dispose mem
return ret
}
long hPic.PixelSearch(long h,colorToFind,_width,_height){
string rawData=hPic.bgr2String(h,_width,_height)
long _fnd=hPic.findColorInRawData(colorToFind,rawData)
case _fnd==-1 : return _fnd
long x=_fnd mod _width,y
case _fnd > 0 : y=_fnd\_width
return x*65536+(_height-y-1)
}
long hPic.findColorInRawData(long col,string data){
long c=1,p
string sCol=chr$(getBValue(col))+chr$(getGValue(col))+chr$(getRValue(col))
do {
p=instr(sCol,data,c)
casenot p : break
casenot (p-1) mod 4 : return p*0.25
c=p+1
}
return span class=s2>- 1
}
Wenn es dann später ums Finden mehrerer Pixel geht würde ich hPic.bgr2String nur einmalig aufrufen. |
|
|
| |
|
|
|
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. |
|
|
| |
|
|
|
| |
|
| |
|
|