为什么 FindWindow 会找到一个 EnumChildWindows 没有的窗口?
How come FindWindow finds a window that EnumChildWindows doesn't?
我正在寻找一个类名为"CLIPBRDWNDCLASS"的窗口(可以在办公应用程序和其他应用程序中找到)。
如果我使用FindWindow或FindWindowEx,我会找到第一个具有此类的HWND,但我想要所有具有该类的窗口,所以我决定使用递归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
不起作用的原因是您要查找的窗口是一个仅限消息的窗口。
FindWindowEx
可以在两种情况下找到它们:
- 如果
hwndParent
和hwndChildAfter
都为NULL - 如果指定"HWND_MESSAGE"作为父窗口
此代码将为您找到所有相关的窗口(此处的解决方案的修改版本):
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()
不会返回HWND_MESSAGE
(至少对于我的测试来说不是)。
枚举所有仅消息窗口的简单方法:
EnumChildWindows(GetAncestor(FindWindowEx(HWND_MESSAGE,0,0,0),GA_PARENT),addr EnumChildProc,0)
//GetAncestor(FindWindowEx(HWND_MESSAGE,0,0,0),GA_PARENT)="GetMessageWindow"(类"MESSAGE")
//GetAncestor(FindWindowEx(HWND_DESKTOP,0,0,0),GA_PARENT)=GetDesktopWindow(类"#32769")
相关文章:
- 没有找到相关文章