Nó trả về chúng theo thứ tự Z. Đầu tiên là cửa sổ cao nhất với WS_EX_TOPMOST
được đặt, cho đến cửa sổ phía dưới cùng với WS_EX_TOPMOST set
, sau đó là cửa sổ cao nhất mà không có WS_EX_TOPMOST
, mặc dù đến cửa sổ dưới cùng bên dưới mà không có WS_EX_TOPMOST
. Lưu ý rằng khả năng hiển thị không phải là yếu tố quyết định, do đó cửa sổ vô hình cao hơn trong thứ tự Z so với cửa sổ hiển thị sẽ vẫn xuất hiện trước nó.
EDIT:
Đó là chắc chắn rằng bạn có thể sử dụng điều này như bạn muốn, chỉ cần tham gia sự trở lại đầu tiên từ EnumWindows
. Cửa sổ mới của bạn không chỉ là cửa sổ đầu tiên mà không phải là cửa sổ đầu tiên, nhưng bạn sẽ có một điều kiện chạy đua nơi các cửa sổ khác có thể được mở trong thời gian chờ đợi. Tuy nhiên, bạn có thể giữ một danh sách tất cả các cửa sổ đã biết cho ứng dụng và khi bạn cần tìm một cửa sổ mới mở, hãy gọi EnumWindows
và so sánh các cửa sổ xử lý với các cửa sổ trong danh sách của bạn. Khi bạn tìm thấy một lớp có chú thích và lớp học chính xác (bạn thậm chí có thể kiểm tra xem nó thuộc về đúng quy trình với GetWindowThreadProcessID
) là không trong danh sách của bạn, sau đó bạn đã tìm thấy cửa sổ mới.
Vì mục đích của bạn, bạn có thể phục vụ tốt hơn bằng cách cài đặt móc nối CBT và xem thông báo HCBT_CREATEWND. Xem trợ giúp MSDN trên SetWindowsHookEx()
và the CBTProc
callback để biết thêm thông tin.
Mức độ chắc chắn về thứ tự liệt kê:
Một số ý kiến và câu trả lời khác cho câu hỏi này đã đề cập đến một thiếu tài liệu chính xác trong MSDN về thứ tự trong đó cửa sổ EnumWindows
lợi nhuận xử lý. Và thực sự, các trang trên EnumWindows
và the EnumWindowsProc
callback đều khá im lặng về vấn đề này.Tôi cung cấp làm bằng chứng sau:
Một C++ Q&A article in MSDN magazine làm nhà nước cụ thể:
EnumWindows liệt kê các cửa sổ ở trên xuống Z-trật tự
Các trang trên EnumChildWindows
ám chỉ đơn đặt hàng trong phần nhận xét:
Một cửa sổ con được di chuyển hoặc định vị lại theo thứ tự Z trong quá trình liệt kê sẽ được liệt kê đúng.
Điều này ngụ ý rằng thứ tự là phụ thuộc vào Z. Và từ đó, trong mô tả của các tham sốhWndParent, nó nói này:
Nếu tham số này là NULL, chức năng này tương đương với EnumWindows.
người ta có thể giả định cùng một logic và thứ tự áp dụng cho EnumWindows
.
- Đây là hành vi quan sát được của hàm này, làm cho nó trở thành một thay đổi đột phá để thay đổi nó. Nói chung, Microsoft đã rất tốt về việc không thực hiện các thay đổi đột phá đối với hành vi có thể quan sát được. Đó không phải là một sự đảm bảo, nhưng đó là một cược khá an toàn. Bạn có nhiều khả năng thấy rằng trong phiên bản tiếp theo, chức năng bạn đang sử dụng đã không còn được dùng nữa và thay thế bằng một phiên bản "Ex" khác — hơn là nhận thấy hành vi quan sát của nó đã thay đổi.
Tất nhiên, đây là tất cả rất học vào thời điểm này, vì EnumWindows
có lẽ không phải là giải pháp tốt nhất cho của OP vấn ít nhất EnumThreadWindows
có lẽ sẽ là một sự phù hợp-nhưng tốt hơn tôi nghĩ rằng nó là đáng nói cho những người khác có thể gặp phải bài đăng này.
Nguồn
2008-11-17 16:15:31
Điều đó nghe có vẻ hợp lý. Bạn có liên kết đến tài liệu về hành vi này ở đâu đó không? Tôi đã mong đợi điều này trong tài liệu 'EnumWindows' ... –
Lưu ý rằng tôi đã viết" xử lý đầu tiên được trả về bởi EnumWindows * có lớp và chú thích khớp với kỳ vọng của tôi * ". Tôi biết rằng các cửa sổ khác phù hợp với các tiêu chí tương tự có thể được mở trong thời gian chờ đợi nhưng trong trường hợp này tôi tin tưởng 95% rằng điều này là khá giả định. –
vấn đề với việc giữ một danh sách các xử lý được biết là (cho đến nay) Tôi không có cách nào để nói khi một cửa sổ được đóng lại để loại bỏ nó khỏi danh sách một lần nữa. điều này một lần nữa có thể là giả thuyết, nhưng làm thế nào tôi biết rằng tay cầm (có khả năng giải phóng) đã không được gán lại cho một cửa sổ mới trong thời gian chờ đợi? –