Die im Code aufgerufene Funktion ImageSearch() kommt aus der "ImageSearchDLL.dll", die im Anhang ist.
function ImageSearch(aLeft: Integer; aTop: Integer; aRight: Integer; aBottom: Integer; aImageFile: PChar): PChar; stdcall; external 'ImageSearchDLL.dll';
Daher denke ich, dass TCanvas hier kein Problem sein dürfte. Die Mausbewegung könnte ja auch außerhalb des Thread ausgeführt werden, sobald der Thread durch gelaufen ist.
Hier habe ich nochmal mit "Pseudo"-Code markiert, wie ich mir erhoffe, dass es funktioniert.
Delphi-Quellcode:
function _ImageSearch(findImage: string; tolerance: Integer; delay: Integer): Boolean;
var
ergebnis : PChar;
ergebnis2 : TStringList;
oldPos : TPoint;
begin
if (tolerance > 0) then findImage := '*' + inttostr(tolerance) + ' ' + findImage;
[THREADSTART]
ergebnis := ImageSearch(0,0,Screen.Width ,Screen.Height ,PCHAR(findImage));
[THREADENDE]
[WENN THREAD DURCHGELAUFEN ANFANG]
if (ergebnis[0] = '1') then
begin
ergebnis2 := split(ergebnis, '|', true);
sleep(delay);
x := StrToInt(ergebnis2[1]) + round(StrToInt(ergebnis2[3])/2);
y := StrToInt(ergebnis2[2]) + round(StrToInt(ergebnis2[4])/2);
oldPos := mouse.CursorPos;
mouse.CursorPos := point(x+Zufallszahl(-5,5),y+Zufallszahl(-5,5));
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
mouse.CursorPos := oldPos;
//showmessage('found' + inttostr(x) + ' ' + inttostr(y));
result := true
end
else
begin
result := false
end;
[WENN THREAD DURCHGELAUFEN ENDE]
end;
Frederick B.