| |
|
|
- Página 1 - |
|
Christian Schneider | ¡Hola,
Yo stehe desafortunadamente veces otra vez en Kriegsfuß con uno .dll. Diesmal es el AutoItX3.dll. Yo möchte el Función AU3_PixelSearch aufrufen. KompilierenMarcaSeparación Como debería ahora el entsprechende Aufruf aussehen? El 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);
Yo komme simplemente no más. Dll y Ayuda hängen al Contribución a.
Saludo Christian |
|
|
| |
|
|
| |
|
- Página 3 - |
|
|
| El Doku el Yo dazu fand beinhaltete lediglich el ya oben einkopierten Aufruf con Parametern - habe nichts así bastante gefunden y deswegen auch el Solución con reinem XProfan erstellt. (Welche deutlich más rápido como el DLL trabajo debería/podría.) |
|
|
| |
|
|
|
Thomas Freier | En me final el pixelSearch.exe se igual beim Starten. |
|
|
| |
|
|
|
| Ein SS.BMP liegt en el Pfad? |
|
|
| |
|
|
|
Thomas Freier | Nein, Se me había olvidado. Nun es y bastante zügig (17.5MB). Würde sin embargo el ersten weissen Pixel a otro Punto vermuten, z.B.: en el Sonnenschirmen. Verkleinertes Ejemplo. Fundort es identisch x=609, y=398. |
|
|
| |
|
|
|
Christian Schneider | RGH
¡Hola,
Auf qué beziehen el Koordinaten, en denen gesucht se? Beziehen que en el Desktop, irgenein Ventana, irgenmdeine Mapa de bits, oder algo muy más?
Yo vermute veces en el Desktop. Zwar hay en AutoIt incluso en Función una optionalen Parámetro para una Handle, sin embargo es dieses en el .dll scheinbar no disponible (zumindest no en el Función incluso / Hinweise en una Einstellmöglichkeit por otro Función podría Yo ebenfalls no encontrar).
RGH
Como el DLL, como oben geschrieben es, offensichtlich initialisiert voluntad muß, muss ellos natürlich auch zuallererst con UseDLL en el Speicher geladen voluntad. Ist ellos esto no es, sería ellos zwar beim Aufruf el Init-Función en el el Speicher geladen, el Función ausgeführt, aber anschließend inmediatamente otra vez entladen voluntad. Dann wäre el Initialisierung para el Katz!
Yo muss gestehen el war me bisher no bewusst. Posesiones ya una wenig en dieser Base herumprobiert, sin embargo con el gleichen Ergebnis como bisher.
RGH
Yo sería vermuten, dass antes el Aufruf de AU3_PixelSearch sólo otro Aufrufe tener lugar necesario, así qué como es, en el gesucht voluntad kann.
Como oben geschrieben podría Yo darauf no Referencia encontrar. Zwar hay algunos Optionen el uno por AutoItSetOption conjunto podría, sin embargo nichts qué wirklich passt. Außerdem es siempre una Default-Valor disponible. |
|
|
| |
|
|
|
| Tuve vergessen una Code [...] para enviar. |
|
|
| |
|
|
|
Christian Schneider | Gracias. Gleich veces einlesen. |
|
|
| |
|
|
|
Christian Schneider | Der Code se ejecuta en me en el Originalzustand sin Problemas.
Nun es me por lo tanto mehrere Farbvorkommen para encontrar (si está disponible). Aber el es no el eigentliche Problema. Kann me alguien begreiflich hacer por qué el folgende 1. Code se ejecuta y 2. no?
1: KompilierenMarcaSeparaciónCLS
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: KompilierenMarcaSeparación $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
Declarar SOMEPOS&
Whileloop 2
SOMEPOS&=HPIC.PIXELSEARCH(HPIC&,COL&,1024,1024)
Endwhile
PRINT X&,Y&
PRINT HIWORD(SOMEPOS&),LOWORD(SOMEPOS&)
WAITINPUT
FIN
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#
RETORNO +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
RETORNO _FND&
ENDIF
var X&=_FND& MOD _WIDTH&
var Y&=0
IF _FND& > 0
Y&=_FND&\_WIDTH&
ENDIF
RETORNO 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
RETORNO P&*0.25
ENDIF
C&=P&+1
ENDWHILE
RETORNO -1
ENDPROC
Der Diferencia liegt en él el en el 1. Ejemplo el Suchfunktion 2x aufgerufen se KompilierenMarcaSeparación y en el 2. Ejemplo ebenfalls, allerdings por Whileloop KompilierenMarcaSeparación Im 2. Ejemplo voluntad Yo darauf hingewiesen el Scol$ no deklariert sei, obwohl vom Verständnis her el Gleiche passieren debería. Natürlich macht el doppelte Aufruf no Sinn. Diese Varianten son lediglich a Fehlersuche entstanden. |
|
|
| |
|
|
|
| Yo habe getestet 2 Tiempo aufzurufen + klappt. Auf el Schnelle podría Yo en Deinem Ejemplo el Fehler no erkennen. KompilierenMarcaSeparación {$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 lo entonces später ums Finden mehrerer Pixel va sería Yo hPic.bgr2String sólo einmalig aufrufen. |
|
|
| |
|
|
|
Jörg Sellmeyer | Mirar en el Ayuda bajo Volver después de:
Wichtig: Auch si una Procedimiento con Volver verlassen se, muss el Definition el Procedimiento con ENDPROC abgeschlossen voluntad. Das Verlassen uno Procedimiento darf no innerhalb uno Mientras que-/Repeat-Bucle tener lugar.
|
|
|
| Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 04.03.2009 ▲ |
|
|
|
|
Christian Schneider | Gracias, el erklärt Einiges. |
|
|
| |
|
|
|
| |
|
| |
|
|