【发布时间】:2012-03-01 14:49:28
【问题描述】:
我正在寻找一个类名为“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返回。
有没有人能说出为什么它不起作用???
【问题讨论】:
-
首先,
EnumChildWindows()is already recursive,您不需要在回调函数中再次调用它。其次,尝试打印你遇到的所有窗口的类名,看看它是否给你一个提示。 -
@Asaf - 感谢 EnumChildWindows() 是递归的,我不知道。我认为它只有直接的孩子。我试过打印所有的名字,但它没有让我到任何地方......看起来这个窗口只是忽略了 EnumChildWindows(),但可以使用 FindWindowEx() 找到。
-
是的,他们的名字很糟糕。您是否尝试在与 Windows 本身相同的进程中使用它?
-
@Asaf - 不...我认为这不重要...