Hallo zusammen,
Ich möchte gern eine Liste von _echten_ Fenstern erhalten ohne irgendwelche "unnütze" Einträge.
Für AutoHotkey nutze ich schon seit längerer Zeit die Folgende:
Code
; This checks if a window is a "real" window
; Derived from: http://www.autohotkey.com/board/topic/5801-alt-tab-replacement-related-getting-only-alt-tab-windows/#entry35580
IsWindow(hwnd)
{
GW_OWNER := 4 ; Window is owned. Windows like the systray aren't owned
WS_EX_APPWINDOW := "0x40000" ; If set = window is visible on taskbar
WS_EX_TOOLWINDOW := "0x80" ; If set = window is NOT on the alt-tab list
WinGet, winExStyle, ExStyle, ahk_id %hwnd%
return ((!DllCall("GetWindow", "uint", hwnd, "uint", GW_OWNER)
and !(winExStyle & WS_EX_TOOLWINDOW))
or (winExStyle & WS_EX_APPWINDOW)) ? 1 : 0
}
Alles anzeigen
Ich hab nun versucht, sie auf AutoIt zu portieren, aber ich bin mit den BitAND Funtionen nicht vertraut (und frage mich, ob ich die überhaupt nutzen muss).
Mein "Versuch":
Code
Local $var = WinList()
For $i = 1 To $var[0][0]
; Only display visble windows that have a title
If $var[$i][0] <> "" And IsWindow($var[$i][1]) Then
MsgBox(0, "Details", "Title=" & $var[$i][0] & @LF & "Handle=" & $var[$i][1])
EndIf
Next
; And StringInStr($var[$i][0], "XYplorer"
; This checks if a window is a "real" window
; Derived from: http://www.autohotkey.com/board/topic/5801-alt-tab-replacement-related-getting-only-alt-tab-windows/#entry35580
Func IsWindow($hwnd)
$GW_OWNER = 4 ; Window is owned. Windows like the systray aren't owned
$WS_EX_APPWINDOW = "0x40000" ; If set = window is visible on taskbar
$WS_EX_TOOLWINDOW = "0x80" ; If set = window is NOT on the alt-tab list
Local $winExStyle = DllCall("user32.dll", "long", "GetWindowLong", "hwnd", $hwnd, "int", -20) ; Get existing ExStyle
If ((NOT DllCall("GetWindow", "uint", $hwnd, "uint", $GW_OWNER) AND BitAND($winExStyle, $WS_EX_TOOLWINDOW)) OR BitAND($winExStyle, $WS_EX_APPWINDOW)) Then
Return 1
Else
Return 0
EndIf
EndFunc ;==>IsWindow
Alles anzeigen
Allerdings erhalte ich praktisch jedes "Fenster", auch wenn es keines ist, was man anklicken könnte.
Könnte jemand mal drüberschauen und Fehler ausbessern?
Danke sehr!