2010-11-02 57 views
1

我的程序有時會從其他程序啓動。如果是這種情況,我希望能夠使用WM_COPYDATA在兩個程序之間來回發送消息。獲取調用程序/被調用程序的HWND

我的子程序啓動後,如何獲取調用程序的HWND?有沒有我可以打電話來做的功能,或者我可以間接做這個功能,例如獲取調用程序的進程ID,然後從那裏進入HWND?

謝謝。

回答

3

有一個小問題。一個調用程序可以在多個窗口中擁有多個HWND。不,恐怕沒有辦法獲得調用程序的PID或類似的東西。至少在Windows中,無法獲得流程的「父」進程。在不知道調用函數的名稱的情況下,你什麼也做不了,那麼你可以查看它的PID並獲取它的活動窗口列表。

我建議向後工作,將調用進程的HWND作爲命令行參數傳遞給您的程序。例如「start YourProgram.exe/hwnd:1234」

編輯:我剛剛發現有一種方法,但只是不提供的Windows。 http://www.codeproject.com/KB/threads/ParentPID.aspx。但有一個警告。不斷地生成和回收PID,所以如果你確實得到了PID,那麼就不能保證它的父項不會死掉(崩潰或結束處理),而PID正在被別的項目使用。然後與所謂的父母過程互動將變得非常危險和不穩定。所以是的,你可以做到。但要小心,如果父系崩潰,並且您嘗試通過其舊PID訪問它,則會遇到主要問題,特別是如果您不小心將某些內容注入到Windows服務主機中時。

2

啓動程序發送的第一條消息是HWND,以便孩子知道發送給誰。

2

鑑於需要找到有效的窗口句柄,WM_COPYDATA是一個相當悲慘的互操作方式。儘管如此,除非另一個程序正在與你的主動合作,否則沒有什麼用處,否則它會把WM_COPYDATA消息轉儲到垃圾箱中。由於該程序已經需要了解很多關於你的信息,包括在哪裏可以找到它並處理消息,因此它可能只是簡單地爲你提供一個包含你需要的命令行參數。

是的,窗口句柄可以作爲命令行參數傳遞,您可以從子進程的main()或GetCommandLine()中獲取它。

考慮命名管道或套接字作爲更好的捕鼠器。或者進程外COM。