在VC++中,我使用EnumWindows(...),GetWindow(...)和GetWindowLong()來獲取窗口列表並檢查窗口是否是頂層窗口(沒有其他窗口作爲所有者),以及是否該窗口可見(WS_VISIBLE)。但是,雖然我的桌面只顯示5個窗口,但是這個EnumWindows給了我50個窗口,多麼有趣!任何Windows怪胎在這裏請幫我澄清...爲什麼EnumWindows會返回比我預期更多的窗口?
回答
列出了(在使用Alt-Tab框或類似)在任務欄僅適用於Windows的方式由雷蒙德這篇文章在MSDN博客中描述:
http://blogs.msdn.com/b/oldnewthing/archive/2007/10/08/5351207.aspx
這是超級函數來檢查是否示於ALT-選項卡窗口:
BOOL IsAltTabWindow(HWND hwnd)
{
TITLEBARINFO ti;
HWND hwndTry, hwndWalk = NULL;
if(!IsWindowVisible(hwnd))
return FALSE;
hwndTry = GetAncestor(hwnd, GA_ROOTOWNER);
while(hwndTry != hwndWalk)
{
hwndWalk = hwndTry;
hwndTry = GetLastActivePopup(hwndWalk);
if(IsWindowVisible(hwndTry))
break;
}
if(hwndWalk != hwnd)
return FALSE;
// the following removes some task tray programs and "Program Manager"
ti.cbSize = sizeof(ti);
GetTitleBarInfo(hwnd, &ti);
if(ti.rgstate[0] & STATE_SYSTEM_INVISIBLE)
return FALSE;
// Tool windows should not be displayed either, these do not appear in the
// task bar.
if(GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW)
return FALSE;
return TRUE;
}
任何人都知道爲什麼這個函數似乎沒有考慮Raymond在他的博客文章中提到的'WS_EX_TOOLWINDOW'和'WS_EX_APPWINDOW'擴展樣式案例? 「STATE_SYSTEM_INVISIBLE」是否覆蓋它,或者這個函數與Raymond描述的函數不完全匹配? –
@adamsmith toolwindow不是頂層窗口,它不會顯示在任務欄或alt-tab菜單中。因爲toolwindow的父窗口不爲空 – jondinham
另一個改進是從列表中刪除工具窗口,該工具窗口也不應顯示。正如@DavidHeffernan在其他答案中提到的那樣,在[以下MSDN文章](http://http//msdn.microsoft.com/en-us/library/aa969325.aspx)中有記錄。我已經通過檢查改進了上面的代碼: 'if(GetWindowLong(hwnd,GWL_EXSTYLE)&WS_EX_TOOLWINDOW) return FALSE;' –
你談論的窗口,與X按鈕和標題欄等不是唯一的窗口。按鈕,下拉菜單,標籤,圖標,文本框,任務欄以及其他所有內容都是窗口。所以EnumWindows
正在做它應該做的事情:列舉所有頂級窗口。
即使這是真的,EnumWindows
只能枚舉頂層窗口。這意味着it won't enumerate any child windows:
EnumWindows函數不枚舉子窗口,與由具有WS_CHILD樣式的系統擁有一些頂層窗口除外。
但是,桌面上的很多東西都是windows,而不僅僅是您想要的「窗口」。
所以任何想法擺脫不相關的「所謂」窗口?我只想要一個可見的窗口列表(應用程序窗口,而不是對話框,而不是按鈕等) – jondinham
你可能只需要[出現在任務欄中的窗口](http:// http://msdn.microsoft.com/en -us /庫/ aa969325.aspx)。 「當應用程序創建一個未被擁有的窗口時,Shell會在任務欄上創建一個按鈕,爲了確保窗口按鈕放置在任務欄上,使用WS_EX_APPWINDOW擴展樣式創建一個無主窗口。放置在任務欄上,使用WS_EX_TOOLWINDOW擴展樣式創建無主窗口。或者,您可以創建一個隱藏窗口,並將該隱藏窗口設置爲可見窗口的所有者。 –
是的,我想要出現在任務欄中的窗口列表。我知道如何隱藏,以不同的模式顯示窗口;但我不知道如何得到這個列表 – jondinham
- 1. QuerySelectorAll返回比預期的更多
- 2. hibernate返回比預期更多的行
- 3. 爲什麼我的HttpClient調用不會返回預期的Json?
- 4. 爲什麼SWbemServices.ExecQuery會返回比請求更多的屬性?
- 5. 爲什麼ValidateUser不會返回更多?
- 6. Curl:返回奇怪的輸出比預期,但爲什麼?
- 7. 函數返回比預期的要多
- 8. 爲什麼此正則表達式分割會返回比預期更多的組件?
- 9. 爲什麼join()方法返回的結果比預期的要多
- 10. 爲什麼我的jquery代碼拿起比我預期更多的行?
- 11. 爲什麼Neo4jClient不會返回數據,但Cypher窗口不會返回
- 12. 爲什麼此Ruby代碼不會返回預期的答案?
- 13. 爲什麼ByteArrayInputStream不會返回預期的結果?
- 14. 爲什麼java程序使用更多的內存比預期
- 15. 爲什麼Property Setter會比預期更頻繁地被調用?
- 16. 爲什麼這個git淺克隆比我預期的更大?
- 17. 爲什麼我的存儲過程不會返回預期的結果?
- 18. Java的int read(byte [] data)返回比預期更多的字節
- 19. mysql的否定之類不會返回什麼預期,爲什麼?
- 20. 爲什麼我的sql日期比較返回0結果
- 21. SELECT DISTINCT返回比預期更多的行
- 22. SQL遞歸CTE返回比預期更多的結果
- 23. SQL左連接返回更多的記錄比預期
- 24. 通過返回比預期更多的行連接
- 25. PDO查詢返回比預期使用LIKE CONCAT更多的值
- 26. glReadPixels返回比預期更多的數據
- 27. PhantomJS onResourceReceived返回比預期更多的結果
- 28. MySQL存儲過程返回比預期的更多
- 29. 列表返回比預期更多的值
- 30. top_n函數返回比預期更多的行
我甚至看到一個窗口ç alled「開始按鈕」 – jondinham
這是因爲開始按鈕是一個窗口。 –