为什么EnumWindows会返回比我预期更多的窗口?

在VC ++中,我使用EnumWindows(…),GetWindow(…)和GetWindowLong()来获取窗口列表,并检查窗口是否是顶层窗口(没有其他窗口作为所有者),以及窗口是可见的(WS_VISIBLE)。 不过,虽然我的桌面只显示5个窗口,但是这个EnumWindows却给了我50个窗口,好笑! 任何Windows怪胎在这里请帮我澄清…

在本文中,Raymond在MSDN博客中描述了仅列出任务栏中的窗口(或类似地在Alt-Tab框中)的方式:
http://blogs.msdn.com/b/oldnewthing/archive/2007/10/08/5351207.aspx

这是检查一个窗口是否显示在alt-tab中的超级函数:

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; } 

在此处获得源代码:
http://www.dfcd.net/projects/switcher/switcher.c

你正在谈论的窗口,有一个X按钮和一个标题栏等不是唯一的窗口。 按钮,下拉菜单,标签,图标,文本框,任务栏,以及其他一切都是一个窗口1 所以EnumWindows正在做它应该做的事情:枚举所有的顶层窗口。

1尽管这是事实, EnumWindows只能枚举顶层窗口。 这意味着它不会枚举任何子窗口 :

EnumWindows函数不枚举子窗口,除了拥有WS_CHILD样式的系统所拥有的几个顶级窗口之外。

不过,桌面上的很多东西都是windows,而不仅仅是你想要的“窗口”。