_ImageSearchArea und relative Koordinaten

  • Sers...

    ich probier mich seit gestern mir AutIt und ich hab ein kleines Problem mit _ImageSearchArea...
    Laut Dokumentation liefert ImageSearchArea die absoluten Koordinaten (wenn ich das richtig verstanden hab), sollte man aber vorher

    [autoit]

    AutoItSetOption ( "PixelCoordMode", 2 )
    AutoItSetOption ( "MouseCoordMode", 2 )

    [/autoit]


    vorher setzen, sollen die Koordinaten eigentlich relativ zum aktiven Fenster sein...

    [autoit]

    _ImageSearchArea( "bild.bmp", 1, 797, 374, 1224, 810, $found_X, $found_Y, 0 )

    [/autoit]


    so benutze ich die Funktion...

    Mein Problem ist nun, dass er zwar das Bild findet und mir auch die richtigen Koordinaten (getestet über eine MsgBox) liefert allerdings absolut, also zum ganzen Bildschirm
    meine Maus bewegt sich aber relativ zum aktiven Fenster... somit wandert die Maus ausserhalb des Fensters und klickt dort wild rum ;)
    Meine Frage daher, wie kann ich mir die koordinaten relativ zum Fenster und nicht zum ganzen Bildschirm holen?
    Alle Koordinaten die ich statisch verwende verhalten sich nämlich relativ zum Fenster...

    Und die _ImageSearch

    Spoiler anzeigen
    [autoit]


    #include-once
    ; ------------------------------------------------------------------------------
    ;
    ; AutoIt Version: 3.0
    ; Language: English
    ; Description: Functions that assist with Image Search
    ; Require that the ImageSearchDLL.dll be loadable
    ;
    ; ------------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    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)

    [/autoit] [autoit][/autoit] [autoit]

    ; If error exit
    if $result[0]="0" then return 0

    [/autoit] [autoit][/autoit] [autoit]

    ; 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],"|")

    [/autoit] [autoit][/autoit] [autoit]

    $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

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Description: Wait for a specified number of seconds for an image to appear
    ;
    ; Syntax: _WaitForImageSearch, _WaitForImagesSearch
    ; Parameter(s):
    ; $waitSecs - seconds to try and find the image
    ; $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
    ;
    ;
    ;===============================================================================
    Func _WaitForImageSearch($findImage,$waitSecs,$resultPosition,ByRef $x, ByRef $y,$tolerance)
    $waitSecs = $waitSecs * 1000
    $startTime=TimerInit()
    While TimerDiff($startTime) < $waitSecs
    sleep(100)
    $result=_ImageSearch($findImage,$resultPosition,$x, $y,$tolerance)
    if $result > 0 Then
    return 1
    EndIf
    WEnd
    return 0
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ;
    ; Description: Wait for a specified number of seconds for any of a set of
    ; images to appear
    ;
    ; Syntax: _WaitForImagesSearch
    ; Parameter(s):
    ; $waitSecs - seconds to try and find the image
    ; $findImage - the ARRAY of images to locate on the desktop
    ; - ARRAY[0] is set to the number of images to loop through
    ; ARRAY[1] is the first image
    ; $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 the index of the successful find
    ; On Failure - Returns 0
    ;
    ;
    ;===============================================================================
    Func _WaitForImagesSearch($findImage,$waitSecs,$resultPosition,ByRef $x, ByRef $y,$tolerance)
    $waitSecs = $waitSecs * 1000
    $startTime=TimerInit()
    While TimerDiff($startTime) < $waitSecs
    for $i = 1 to $findImage[0]
    sleep(100)
    $result=_ImageSearch($findImage[$i],$resultPosition,$x, $y,$tolerance)
    if $result > 0 Then
    return $i
    EndIf
    Next
    WEnd
    return 0
    EndFunc

    [/autoit]

    3 Mal editiert, zuletzt von majin (14. August 2009 um 12:34)

  • Wenn das Programm zu einen Bot werden soll

    dann biste hier falsch, denn Bots werden nicht unterstützt lese Forenregeln

  • Es wird nur ein Bild innerhalb eines Fensters gesucht und meine Frage bezieht sich auf die Funktion des Befehls
    bzw. wie ich die relativen Koordinaten rausbekomme...
    sehe da keinen Bezug zu einem Bot... aber danke für den Hinweis :)

  • falls nach mir nochmal jemand ein solches Problemhaben sollte...
    ich habs leider nicht lösen können, aber ich bin es umgangen... vllt ein bisschen dreckig, erfüllt aber seinen zweck...

    [autoit]

    _ImageSearchArea( "bild.bmp", 1, 797, 374, 2110, 2110, $found_X, $found_Y, 0 )
    AutoItSetOption ( "MouseCoordMode", 1 )
    MouseMove($foundMana_X, $foundMana_Y)
    AutoItSetOption ( "MouseCoordMode", 2 )
    $pos = MouseGetPos()
    MouseClickDrag("left", $pos[0], $pos[1], 488 , 750, 5)

    [/autoit]