DLL中獲取主程序句柄


一、問題由來及說明

在實際編程中遇到一些系統模塊(或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撰寫整理,有問題歡迎評論及郵件。轉載請注明原文地址。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM