Как уже отмечали другие
- В общем случае приложение может иметь ноль или несколько окон верхнего уровня.
- Если вы создаете окно самостоятельно, вы можете просто вспомнить 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 для выполнения этой задачи, рискует оказаться в бесконечном цикле или сослаться на дескриптор окно, которое было разрушено. "