我正在寻找一个类名称为“CLIPBRDWNDCLASS”的窗口(它可以在办公应用程序和其他应用程序中找到)。
如果我使用 FindWindow 或 FindWindowEx 我找到第一个具有此类的 HWND,但我想要all具有该类的窗口,因此我决定使用递归 EnumChildWindows 枚举所有窗口并找到我想要的窗口:
//-------------------------------------------------------------------------------
BOOL CALLBACK enum_wnd_proc(HWND h, LPARAM lp)
{
char cls[1024] = {0};
::GetClassNameA(h, cls, 1024);
if(std::string(cls) == "CLIPBRDWNDCLASS")
{
// match!
}
::EnumChildWindows(h, enum_wnd_proc, NULL);
return TRUE;
}
//-------------------------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
::EnumWindows(enum_wnd_proc, NULL);
return 0;
}
//-------------------------------------------------------------------------------
这是这个窗口不由EnumWindows返回,仅由FindWindow返回。
有谁能告诉我为什么它不起作用???
原因EnumWindows
不起作用的是您正在寻找的窗口是仅消息窗口 http://msdn.microsoft.com/en-us/library/windows/desktop/ms632599%28v=vs.85%29.aspx#message_only.
FindWindowEx
可以在两种情况下找到它们:
- If both
hwndParent
and hwndChildAfter
为 NULL。
- 如果您指定“HWND_MESSAGE”作为您的父窗口。
此代码将为您找到所有相关的窗口(解决方案的修改版本here http://www.codeguru.com/forum/showthread.php?t=208587):
HWND hWindow = FindWindowExA(HWND_MESSAGE, NULL, "CLIPBRDWNDCLASS", NULL);
while (hWindow )
{
// Do something here with window...
// Find next window
hWindow = FindWindowExA(HWND_MESSAGE, hWindow , "CLIPBRDWNDCLASS", NULL);
}
另请注意,与上面链接中所写的不同,GetParent()
对于只有 Windows 的消息not return HWND_MESSAGE
(至少对于我的测试来说不是)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)