EnumWindows And the Enumeration of Real Windows

Posted on: Tue, 11/22/2005 - 23:16 By: dae

จะหา 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;