Fenster unter dem Mauscursor ermitteln

  • Hallo,

    ich würde gerne das Fenster-handle / den Fenstertitel des Fensters unter der Maus herausfinden. Wenn mehrere Fenster übereinander liegen sollte es das oberste Fenster sein. Die Ausgabe muss auch mit Fenstern, die inaktiv sind funktionieren.

    Folgender Ansatz liefert oft, aber bei weitem nicht immer das handle zurück:

    Wenn mehrere Fenster übereinander liegen zeit das script gerne mal falsche infos an, ausserdem funktioniert es mehr schlecht als recht, wenn mehrere Fenster derselben Klasse existieren.

    Wie würdet ihr das Ganze lösen ?


    EDIT: Das hier zeigt das selbe Verhalten:

    Einmal editiert, zuletzt von level20peon (21. Mai 2009 um 15:38)

    • Offizieller Beitrag

    Probier mal:

    [autoit]

    Func GetForegroundWindow()
    Local $ret = DllCall("user32.dll", "long", "GetForegroundWindow")
    If Not @error Then
    Return $ret[0]
    Else
    Return 0
    EndIf
    EndFunc

    [/autoit]
    Zitat

    The GetForegroundWindow function returns the handle of the foreground window (the window with which the user is currently working). The system assigns a slightly higher priority to the thread that creates the foreground window than it does to other threads.

  • Danke für die Antwort. Leider gibt dein Beispiel nur das Fenster im Vordergrund aus.

    Ich habe gerade herausgefunden wo der Fehler steckt, leider konnte ich ihn nicht lösen.

    Die von mir oben genannten Beispiele geben jeweils das Fenster zurück, welches auf der X-Koordinate des Mauscursors liegen, jedoch wird die Y-Koordinate immer als 0 zurückgegeben. Wenn ich die Funktionen _WinAPI_GetMousePosX bzw _WinAPI_GetMousePosY aus der WinAPI.au3 einzeln benutze werden jedoch beide Koordinaten korrekt angezeigt. Jetzt müsste ich nur noch rausfinden, wie ich die beiden Koordinaten an _WinAPI_WindowFromPoint weiterreichen kann, da die Funktion ja nur die eine Variable $tPoint annimmt.

    EDIT: Habe die einzelnen Variablen (also X- und Y-Koordinate) in eine Tagpoint Struktur gepackt und an _WinAPI_WindowFromPoint weitergeleitet. Hier tritt das selbe Problem aber wieder auf, es wird nur die X-Koordinate berücksichtigt, die Y-Koordinate wird weiterhin als 0 angenommen.

    Einmal editiert, zuletzt von level20peon (21. Mai 2009 um 16:44)

    • Offizieller Beitrag

    Dann so:

    [autoit]

    Local $tagPOINTAPI = DllStructCreate('long x;long y')
    DllCall('user32.dll', 'long', 'GetCursorPos', 'ptr', DllStructGetPtr($tagPOINTAPI))
    Local $xPoint = DllStructGetData($tagPOINTAPI, 'x')
    Local $yPoint = DllStructGetData($tagPOINTAPI, 'y')
    Local $hWnd_under_Mouse = WindowFromPoint($xPoint, $yPoint)
    If $hWnd_under_Mouse Then MsgBox(0, '', 'Handle = ' & $hWnd_under_Mouse)

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

    Func WindowFromPoint($xPoint, $yPoint)
    Local $ret = DllCall("user32", 'long', 'WindowFromPoint', 'long', $xPoint, 'long', $yPoint)
    If Not @error Then
    Return $ret[0]
    Else
    Return 0
    EndIf
    EndFunc

    [/autoit]
  • Vielen Dank für deine Mühe BugFix. Das Kopfzerbrechen der letzten Tage fand eben ein vorläufiges Ende.

    Der "Bug" liegt nicht in den scripts, sondern an der Tatsache, dass die WindowFromPoint API Funktion die tagPoint Struktur in einem x64 OS anders als in einem x86 OS behandelt. Mit den bei einem x64 System ausgegebenen DLL calls kann das script nichts oder nur teilweise etwas anfangen. Wenn ich das script im (x86) Modus ausführe funktioniert mein eingangs erwähntes Beispiel einwandfrei.

    Vielleicht könnte sich ein dev dies mal anschauen ?