Diese Funktion holt aber wohl alle Windows, auch die Childs bzw. Controls... daran erkennbar, weil etliche Windows dieselbe PID/TID haben.
Laut MSDN:
ZitatEnumWindows continues until the last top-level window is enumerated or the callback function returns FALSE.
Ich habe testweise den DLL-Aufruf nochmal selbst in einer Funktion erstellt - liefert dieselbe Anzahl. Vielleicht verwendet die AutoIt Funktion stattdessen EnumDesktopWindows. Allerdings braucht diese Funktion ein Desktop Handle. Habe ich mir noch nicht weiter angesehen.
EDIT:
Habe es mal getestet. Alle mit EnumWindows gefundenen Fenster verwenden dasselbe Desktop-Handle, somit wird EnumDesktopWindows dasselbe Ergebnis liefern.
EDIT2:
Ich habe mal noch gefiltert:
- Parent muss "0" sein
- Fenster muss Titel haben
Das schmilzt die Sache deutlich zusammen.
proc my_WndEnumProc(hwnd: HWND, lp: LPARAM): WINBOOL {.stdcall.} =
if GetParent(hwnd) == 0:
var
buflen = GetWindowTextLengthW(hwnd) + 1
buf = newWideCString("", buflen)
className = newWideCString("", 4096)
pPID: LPDWORD
pTID = GetWindowThreadProcessId(hwnd, cast[LPDWORD](addr pPID))
oWndID = WndID(pid: cast[int](pPID), tid: cast[int](pTID))
discard GetWindowTextW(hwnd, cast[LPWSTR](addr buf[0]), buflen)
discard GetClassNameW(hwnd, cast[LPWSTR](className), 4096)
if buf.len != 0:
sEnumWnd.add(EnumWnd(hwnd: hwnd,
class: className,
title: buf,
pid: oWndID.pid,
tid: oWndID.tid))
return TRUE
Alles anzeigen
Ich habe es hin bekommen... er meckert nicht mehr
Habe ich schon so oft in den Beschreibungen gelesen: "must be discarded". Einfach auch mal dran denken. ![]()