在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. 为什么我的HttpClient调用不会返回预期的Json?
- 3. 为什么ValidateUser不会返回更多?
- 4. Curl:返回奇怪的输出比预期,但为什么?
- 5. 为什么join()方法返回的结果比预期的要多
- 6. 为什么我的jquery代码拿起比我预期更多的行?
- 7. 为什么ByteArrayInputStream不会返回预期的结果?
- 8. 为什么Property Setter会比预期更频繁地被调用?
- 9. 为什么这个git浅克隆比我预期的更大?
- 10. 通过返回比预期更多的行连接
- 11. 普罗米修斯TOPK返回更多的结果比预期
- 12. top_n函数返回比预期更多的行
- 13. SELECT DISTINCT返回比预期更多的行
- 14. 列表返回比预期更多的值
- 15. glReadPixels返回比预期更多的数据
- 16. SQL左连接返回更多的记录比预期
- 17. SQL递归CTE返回比预期更多的结果
- 18. 为什么我的sql日期比较返回0结果
- 19. 为什么我的ClaimsRequest会返回null?
- 20. 为什么session.createCriteria(classtype).list()比列表返回更多的对象?
- 21. 为什么我的工会的规模比我预期的要大?
- 22. 这种自左联接将返回更多的记录比我预期
- 23. 为什么我的$ .each调用返回比元素更多的结果?
- 24. 为什么LINQ查询返回比我查询的表更多的结果/行?
- 25. 为什么这会返回我'undefined'
- 26. 这个预测会返回什么?
- 27. MySql - 为什么ENUM需要比预期多的空间?
- 28. 为什么我的JPEG文件比预期的大?
- 29. 为什么Request.IsSecureConnection在预期值为true时返回false
- 30. 为什么这个条件lambda函数不会返回预期的结果?
我甚至看到一个窗口ç alled“开始按钮” – jondinham
这是因为开始按钮是一个窗口。 –