WinGetPos, coords für FensterINHALT

  • Hallo Leute,

    ich arbeite derzeit an einem kleinen bzw. großen Projekt, mit Automatischen scriptsupdater, etc.
    Nun komme ich bei einer Sache nicht weiter, wenn ich das Fenster erst einmal normal einlese und dann mit WinGetPos die aktuellen coordinaten des Fenster auslese, liest er mir aber auch die coordinaten mit dem Rahmen ein,
    Ich will aber nur den Fensterinhalt haben ohne Rahmen, aber es klappt einfach nicht?
    Mit welcher funktion kann man die coordinaten des Fensterinhalts auslesen?

    2 Mal editiert, zuletzt von DeathNote (29. Juli 2011 um 15:53)

  • Dieses Beispiel sollte helfen:

    [autoit]

    $form1 = GUICreate("I'm a window")
    GUISetState()

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

    $aPos = WinGetCaretPos()
    $aSize = WinGetClientSize($form1)

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

    MouseMove($aPos[0],$aPos[1],10)
    MouseMove($aPos[0]+$aSize[0],$aPos[1],50)
    MouseMove($aPos[0]+$aSize[0],$aPos[1]+$aSize[1],50)
    MouseMove($aPos[0],$aPos[1]+$aSize[1],50)
    MouseMove($aPos[0],$aPos[1],50)

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

    While GUIGetMsg()<>-3 And Sleep(1)
    WEnd

    [/autoit]

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Wenn ich das inne GUI packe funktioniert zwar noch, aber er bewegt die mouse dann falsch, wiesoo?

  • Du solltest einen relevanten Codeteil bzw. den gesamten Code posten, damit "jemand"
    nachvollziehen kann, warum es offenbar nicht klappt.

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Das ist mein script, also wenn ich auf start klicke und ich das Fenster einlese, dann soll er ja eigentlich links oben mit der Maus hin, aber er geht ein stückchen weiter rechts. Klicke ich jetzt erneut auf Start ohne das script nochmal zu schließen und wieder zu öffnen, dann geht er mit der Maus diesesmal richtig nach links oben.
    Bei hunderten von Tests geht er imemr beim 1. mal falsch aber beim 2. Mal richtig, wieso?

    [autoit]

    HotKeySet ("{F11}", "ende")

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

    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Main = GUICreate("MouseMove Test", 283, 106, 543, 415)
    GUISetFont(8, 400, 0, "Comic Sans MS")
    GUISetBkColor(0xFFFFFF)
    $combo = GUICtrlCreateCombo("Wähle die Art des MouseMove aus!", 16, 16, 249, 25)
    GUICtrlSetData(-1, "MouseMove 1")
    $Start = GUICtrlCreateButton("Start", 64, 64, 153, 25, $WS_GROUP)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $msg = GUIGetMsg(1)
    Select
    Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $Main
    Exit
    Case $msg[0] = $Start
    MsgBox(0, "Fenster einlesen", "Bitte Fenster innerhalb von 3 Sekunden auswählen!")
    Sleep(3000)
    $fenstername = WinGetTitle("")
    MsgBox(0, $fenstername, "Das ausgewählte Fenster ist:" & @CRLF & $fenstername)
    Sleep (2000)
    WinActivate($fenstername)
    Sleep (1000)

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

    If WinActive($fenstername) Then
    $fensterposition = WinGetCaretPos()
    EndIf

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

    If not WinActive($fenstername) Then
    MsgBox ( 64, "Fehlermeldung!", $fenstername & " war nicht Aktiv!" & @CRLF & "Bitte starte das Programm erneut!")
    exit
    EndIf

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

    If WinActive($fenstername) Then
    MouseMove ($fensterposition[0], $fensterposition[1])
    EndIf
    EndSelect
    WEnd

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

    Func ende ()
    Exit
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von DeathNote (29. Juli 2011 um 14:24)

  • Na ja, such Dir halt das Passende aus:

    Spoiler anzeigen
    [autoit]

    Func WinGetClientPos($HWND)
    ; Returns an attay with: [0] = Left, [1] = Top, [2] = Width, [3] = Height (screen coordinates)
    Local $aPos[4]
    Local $aSize
    Local $Point = DllStructCreate("Long X;Long Y")
    $HWND = HWnd($HWND)
    DllCall("User32.dll", "BOOL", "ClientToScreen", "HWND", $HWND, "Ptr", DllStructGetPtr($Point))
    $aPos[0] = DllStructGetData($Point, "X")
    $aPos[1] = DllStructGetData($Point, "Y")
    $aSize = WinGetClientSize($HWND)
    $aPos[2] = $aSize[0]
    $aPos[3] = $aSize[1]
    Return $aPos
    EndFunc

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

    Func WinGetClientRect($HWND)
    ; Returns an attay with: [0] = Left, [1] = Top, [2] = Right, [3] = Bottom (screen coordinates)
    Local $aPos[4]
    Local $aSize
    Local $Point = DllStructCreate("Long X;Long Y")
    DllCall("User32.dll", "BOOL", "ClientToScreen", "HWND", $HWND, "Ptr", DllStructGetPtr($Point))
    $aPos[0] = DllStructGetData($Point, "X")
    $aPos[1] = DllStructGetData($Point, "Y")
    $aSize = WinGetClientSize($HWND)
    $aPos[2] = $aPos[0] + $aSize[0]
    $aPos[3] = $aPos[1] + $aSize[1]
    Return $aPos
    EndFunc

    [/autoit]
  • Okay konnte es selbst lösen, da ich wie gesagt, beim 1x es nicht funktioniert, aber beim 2. mal, habe ich einfach das Fenster 2x einlesen lassen und mit den zweiten variablen des einlesens weitergearbeitet, jetzt läuft alles einwandfrei :)