FindWindow怎么find一个EnumChildWindows没有的窗口?

我正在寻找一个窗口,其类名是“CLIPBRDWNDCLASS”(它可以在办公室应用程序和其他应用程序中find)。

如果我使用FindWindow或FindWindowEx,我find了第一个有这个类的HWND,但是我想要所有带有这个类的窗口,所以我决定使用recursionEnumChildWindows枚举所有窗口并find我想要的窗口:

//------------------------------------------------------------------------------- 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返回。

有没有人可以告诉它为什么不起作用?

Solutions Collecting From Web of "FindWindow怎么find一个EnumChildWindows没有的窗口?"

EnumWindows不起作用的原因是您正在寻找的窗口是一个消息窗口 。

FindWindowEx可以在两种情况下找到它们:

  1. 如果hwndParenthwndChildAfter都是NULL。
  2. 如果您指定“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(class“#32769”)