2012-08-16 110 views
3

我正在與一個不尋常的設計的特殊項目。如何將窗口句柄傳遞給子進程?

在我的應用程序/過程中,我將創建一個子過程來完成一些工作。在我的過程中,我需要從子流程中獲得反饋。我想將我的應用程序/進程的Windows句柄傳遞給這個子進程,所以我從這個子進程發佈消息。

如何將窗口句柄傳遞給子過程?我的子過程是無窗的用戶界面和使用這樣的主要功能的命令行應用程序:

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
        LPTSTR lpCmdLine, int nCmdShow) 

我應該通過窗口句柄的主要功能?怎麼樣?

感謝

+0

帶winmain的命令行應用程序?非常不尋常的設計。爲什麼窗口句柄想要通過? HWND? – Xearinox 2012-08-16 07:29:52

+0

如果你想要HWND。 GetConsoleWindow是你的朋友。 http://msdn.microsoft.com/en-us/library/ms683175%28VS.85%29.aspx – Xearinox 2012-08-16 07:37:21

+1

只需使用命令行參數。將HANDLE轉換爲DWORD(64位也可以)並從中生成一個字符串。對於這個手柄要小心,沒有太多的事情可以用安全的方式進行。像任何需要在wparam或lparam中傳遞指針的窗口消息一樣,這些指針值在其他進程中無效。 – 2012-08-16 11:35:35

回答

10

窗口句柄(HWNDs)是全局性的系統,讓您可以只打印句柄作爲一個十進制數轉換爲字符串緩衝區,把它作爲對命令的字符串當你用CreateProcess產生你的子進程,並調用_wtoi()或類似的函數將字符串轉換回句柄。

+1

如果出於某種原因不想使用命令行參數,則一個(不太優雅的)替代方法就是一個環境變量。 – 2012-08-16 22:12:34

+0

這是記錄在MSDN中還是隻是一個實現細節? – 2016-07-07 11:01:36

0
  1. 創建一個名爲互斥(全球),所以這兩個進程可以訪問它, 並把它。
  2. 產卵第二個過程。它應該等待互斥鎖 被釋放。
  3. 然後,您可以使用任何進程間通信方法傳遞窗口句柄;最簡單的可能是Shared Memory。只需將重複的句柄寫入共享內存即可。
  4. 釋放互斥量,以便第二個進程可以抓住它。
  5. 從共享內存中讀取句柄。現在使用它是安全的。

整個互斥操作只是爲了確保第二個進程在寫入任何內容之前不會從共享內存讀取。

(感謝@JonathanPotter徵求意見)

+0

窗口句柄不是正常的內核句柄,也不能傳遞給DuplicateHandle等。它們對系統來說是全局的,對進程來說不是本地的。 – 2012-08-16 08:50:24

+1

@JonathanPotter看起來像你是對的:http://www.codeproject.com/Articles/9110/Inside-Windows-Handles。謝謝,我會編輯答案來匹配。 – Lyth 2012-08-16 12:47:53

相關問題