一、問題由來及說明
在實際編程中遇到一些系統模塊(或API)調用初始化需要窗口句柄,在主程序中(MFC或者win32)都可以很容易獲得,比如mfc中可以直接調用AfxGetMainWnd()、GetSafeHwnd()獲取窗口句柄。但是如果跨DLL調用就很難拿到主程序的窗口句柄,那么如何獲取呢?
二、可用的方法介紹
1. FindWindow/FindWindowEx函數
如果知道主調程序的進程名稱,可以用FindWindow枚舉並查找系統運行的所有窗口函數。
該函數之所以可以運行,是因為windows下HWND是全局的,在系統中是唯一的。
有一個缺點,如果主調程序運行多個實例的話,FindWindow基本上是無能為力的,是無法區分那個實例的。
2. EnumWindows函數
如果能夠獲取當前的進程pid(通常調用GetCurrentProcessId函數),可以通過EnumWindows枚舉當前系統中所有的窗口函數,然后遍歷。調用GetWindowThreadProcessId函數,可以將EnumWindows的回調的HWND轉換為進程pid。這樣就可以精確定位了。
當然,也可以使用FindWindow函數。
3. GetGUIThreadInfo函數
上面兩個方法都是i需要遍歷系統中所有窗口的,這個函數可以直接通過線程pid獲取主窗口句柄,感興趣的可以查看下msdn。
https://msdn.microsoft.com/en-us/library/ms633506(v=vs.85).aspx
說明下:博客很久沒寫了。還是比較傾向於解答問題的方式,直觀,也認識到自己成長的腳步。所以以后有什么問題都會及時記錄與更新。內容可能會很短,只有基本的思路。實際編碼可以后續深入探討下。
------------------------
成長的路,披荊斬棘,無所畏懼。
本文是由Tocy撰寫整理,有問題歡迎評論及郵件。轉載請注明原文地址。