正如其他人已經指出
- 通常,應用程序可以有零個或多個頂層窗口。
- 如果您自己創建窗口,則可以在某處記住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執行此任務的應用程序有被陷入無限循環或引用窗口句柄的風險已經被摧毀。「
因爲我不是創建一個窗口一個線程的DLL。我的模塊是用別人的代碼編譯的。因此,我無法訪問創建窗口。 現在,知道了,我如何獲得正在運行的應用程序窗口的HWND? – wonderer 2009-07-14 14:20:07
因此,您甚至無法訪問我假設的窗口消息泵? 然後我唯一能想到的就是EnumWindows,然後使用GWL_HINSTANCE參數調用GetWindowLong並將返回的HINSTANCE與從GetModuleHandle返回的HINSTANCE進行比較。 – Goz 2009-07-14 14:45:30
值得注意的是,你會得到與你的HINSTANCE相關的每個HWND ... – Goz 2009-07-14 14:51:40