Skip to main content

EnumWindows And the Enumeration of Real Windows

Submitted by admin on

จะหา Windows บนจอที่มี ตอนแรกไปเปิด Win32API เจอ EnumWindows ตอนแรกนึกว่าจะใช้ได้เลย แต่พอใช้จริง ๆ ดันเจออะไรบ้าบอเต็มไปหมด คือเป็น Windows ที่เป็น Top Level แต่มีอะไรบ้า ๆ บอ ๆ เยอะ คือเจอ Windows ที่มันไม่โผล่มาให้เห็นหลายอัน

หลังจากไล่ ๆ search ใน net สักพัก ก็เลยรู้ว่าต้อง Check ดังต่อไปนี้ด้วย

  • ต้องเป็น Windows ที่ Visible สามารถ check ได้จาก IsWindowVisible
  • ต้องไม่มีป๊ะป๋า คือเป็นโคตรเตี่ย windows check จาก GetParent
  • ต้อง (have no owner and are not Tool windows) OR (have an owner and are App windows) สามารถดูได้จาก GetWindowLong(hwnd, GWL_EXSTYLE)
  • สุดท้าย มันควรจะมี Caption ดูได้จาก GetWindowText

source code version delphi จะเป็นยังเงี้ย

if IsWindowVisible(hWnd) then begin If GetParent(hWnd) = 0 Then begin hasNoOwner := (GetWindow(hwnd, GW_OWNER) = 0); lExStyle := GetWindowLong(hwnd, GWL_EXSTYLE); If (((lExStyle And WS_EX_TOOLWINDOW) = 0) And hasNoOwner) Or (((lExStyle And WS_EX_APPWINDOW) <> 0) And Not hasNoOwner) Then begin If GetWindowText(hwnd, TheText, SizeOf(TheText)) > 0 Then begin st := TheText; Form1.Memo1.Lines.Add(Format('[%s]',[st])); End; End; End; end;