2012-07-06 113 views
1

可能重複:
Embedding HWND into external process using SetParent的各種問題,以嵌入窗戶進入外部進程

我試圖嵌入從我的過程中一個窗口,一個外部進程的使用窗口SetParent功能,並遇到一些問題,我希望有人可以幫助我。首先,這裏是什麼,我目前在做我的窗口嵌入到應用程序中的輪廓:

WND myWindow; //Handle to my application window 
HWND externalWindow; //Handle to external application window 

SetParent(myWindow,externalWindow); 

//Remove WS_POPUP style and add WS_CHILD style 
DWORD style = GetWindowLong(myWindow,GWL_STYLE); 
style = style & ~(WS_POPUP); 
style = style | WS_CHILD; 
SetWindowLong(myWindow,GWL_STYLE,style); 

此代碼的工作和我的窗口出現在其他應用程序,但引入了以下問題:

  • 當我的窗口獲得輸入焦點時,外部進程的主應用程序窗口失去焦點(即標題欄更改顏色)。
  • 當我的窗口有焦點時,主應用程序的鍵盤快捷鍵命令不起作用。

有沒有人知道這些問題的解決方法?我希望我的窗口被視爲主應用程序的另一個子窗口。

謝謝。

+0

我不知道這是正確的路要走。最有可能的一段時間後修復一個缺陷,你會發現另一個問題... – 2012-07-06 04:19:49

+0

這不是很容易。你有外部窗口的代碼嗎?嘗試去爲MDI兒童!讓父母更容易提供一個窗口,然後窗口將成爲您的子窗口的父窗口/框架。如果你有代碼,有辦法做到這一點。您將不得不延長我相信的資源鏈。你有沒有機會讓你的孩子處理一個DLL? – 2012-07-06 05:31:19

+1

@Mark Hall:你說得對,它似乎甚至是一個確切的副本。 – 2012-07-06 05:36:04

回答

1

當我的窗口獲得輸入焦點時,外部進程的主應用程序窗口失去焦點(即標題欄更改顏色)。

您需要使用AttachThreadInput將進程的線程附加到主機進程的輸入隊列。除了在所有連接的線程之間同步消息處理外,這還會導致它們共享焦點,異步鍵狀態,激活以及其他與輸入相關的屬性。

當我的窗口有焦點時,主應用程序的鍵盤快捷命令不起作用。

當您的窗口具有鍵盤焦點時,擁有窗口的線程將接收來自系統的所有鍵盤消息。如果您需要主窗口的UI線程來處理加速器,則必須以某種方式將鍵盤輸入路由到該線程以進行預處理。你如何做到這一點很大程度上取決於你用於應用程序的UI技術以及你需要如何處理加速器。

構建跨越不同進程中多個線程的用戶界面很困難,並且存在許多缺陷。

+0

@Mare無限極,它是Mark Hall的副本,當我在應用程序中嵌入外部應用程序(如notepad.exe)時遇到了同樣的問題。 – Sean 2012-07-06 06:29:36

+0

Thnaks爲您提供了詳細的建議,並且我嘗試了這樣的方式: DWORD dwPtyID = :: GetWindowThreadProcessId(hWnd,NULL); // hWnd指示外部應用程序的句柄。 DWORD dwprocID = :: GetCurrentThreadId(); :: AttachThreadInput(dwprocID,dwPtyID,true); 但這不起作用。 再次感謝 – Sean 2012-07-06 06:34:00

+1

「這不起作用」是什麼意思?什麼時候不起作用?你會得到什麼錯誤? (關於它的價值:試圖嵌入另一個你不能控制的應用程序可能不能很好地工作,如果有的話)。 – 2012-07-06 15:46:26