Einzelnen Beitrag anzeigen

Kanne

Registriert seit: 15. Mai 2003
5 Beiträge
 
Delphi XE2 Professional
 
#19

AW: Bildschirm nach bestimmten Bitmap absuchen

  Alt 16. Nov 2016, 22:03
P.S.:

deine Deklaration hat vollkommen falsche Parameter, ähnlich den Aufrufen von AutoID,
die wohl Anlass für Auslagerung der Codeteile von AutoHotKey in eine DLL waren !

zB: "resultPosition" gibt es in der DLL gar nicht, wird bei 1(Center) durch AutoID über die Rückgaben berechnet (Pos + Größe /2)
dafür sind in der o.g. Deklaration keine Eingrenzungen des Bereichs möglich, was die DLL aber kann und für Performance auch wichtig ist !
Das hat AutoID nun wieder über eine 2. Funktion ImageSearchArea gelöst:

Code:
===============================================================================
Einbindung AutoID (.au3)
===============================================================================
 ;===============================================================================
 ;
 ; Description:    Find the position of an image on the desktop
 ; Syntax:         _ImageSearchArea, _ImageSearch
 ; Parameter(s):  
 ;                 $findImage - the image to locate on the desktop
 ;                 $tolerance - 0 for no tolerance (0-255). Needed when colors of
 ;                              image differ from desktop. e.g GIF
 ;                 $resultPosition - Set where the returned x,y location of the image is.
 ;                                   1 for centre of image, 0 for top left of image
 ;                 $x $y - Return the x and y location of the image
 ;
 ; Return Value(s): On Success - Returns 1
 ;                 On Failure - Returns 0 
 ;
 ; Note: Use _ImageSearch to search the entire desktop, _ImageSearchArea to specify
 ;     a desktop region to search
 ;
 ;===============================================================================
 
 Func _ImageSearch($findImage,$resultPosition,ByRef $x, ByRef $y,$tolerance)
    return _ImageSearchArea($findImage,$resultPosition,0,0,@DesktopWidth,@DesktopHeight,$x,$y,$tolerance)
 EndFunc
       
 Func _ImageSearchArea($findImage,$resultPosition,$x1,$y1,$right,$bottom,ByRef $x, ByRef $y, $tolerance)
    ;MsgBox(0,"asd","" & $x1 & " " & $y1 & " " & $right & " " & $bottom)
    if $tolerance>0 then $findImage = "*" & $tolerance & " " & $findImage
    $result = DllCall("ImageSearchDLL.dll","str","ImageSearch","int",$x1,"int",$y1,"int",$right,"int",$bottom,"str",$findImage)

    ; If error exit
     if $result[0]="0" then return 0
   
    ; Otherwise get the x,y location of the match and the size of the image to
    ; compute the centre of search
    $array = StringSplit($result[0],"|")
   
    $x=Int(Number($array[2]))
    $y=Int(Number($array[3]))
    if $resultPosition=1 then
       $x=$x + Int(Number($array[4])/2)
       $y=$y + Int(Number($array[5])/2)
    endif
    return 1
 EndFunc
Wichtig ist der DLL-Aufruf:
DllCall("ImageSearchDLL.dll","str","ImageSearch"," int",$x1,"int",$y1,"int",$right,"int",$bottom,"str ",$findImage)
Dies entspricht meiner Deklaration in Delphi - Rückgabe ist ein String mit verketteten Werten (siehe meinen Delphi-Source)

Geändert von Kanne (16. Nov 2016 um 22:19 Uhr)
  Mit Zitat antworten Zitat