正如其他人已经指出的那样
- 通常,一个应用程序可以有零个或多个顶级窗口。
- 如果您自己创建窗口,您可以在某处记住 HWND。
但也许您的代码在 DLL 中,因此您实际上并没有自己创建顶级窗口。那么该怎么办?
我建议如下:
- 用于
EnumWindows
枚举所有顶级窗口。
- 用于
GetWindowLongPtr
获取每个顶级窗口的 HINSTANCE。将此与应用程序的 HINSTANCE 进行比较,您可以使用GetModuleHandle(NULL)
. 如果它们相同,则您已找到主窗口。
编辑:这是一些代码。原来你也必须使用IsWindowVisible
,因为似乎有很多不可见的“帮助”窗口。
HWND hwndMain;
BOOL CALLBACK EnumWindowProc(HWND hwnd, LPARAM lParam)
{
HINSTANCE hinst=(HINSTANCE)GetModuleHandle(NULL);
if((HINSTANCE)GetWindowLongPtr(hwnd, GWL_HINSTANCE)==hinst &&
IsWindowVisible(hwnd))
{
hwndMain=hwnd;
return FALSE;
}
else
return TRUE;
}
然后在你想找到窗口的地方:
hwndMain=NULL;
EnumWindows(EnumWindowProc, 0);
在此之后,hwndMain
应该包含窗口的句柄,或者NULL
如果不存在。
使用EnumWindows
有点麻烦,但建议GetWindow
不要在循环中调用,因为正如 MSDN 指出的那样:“调用 GetWindow 来执行此任务的应用程序可能会陷入无限循环或引用已被破坏的窗口的句柄。”