2008-10-04 15 views
18

我試圖使用的setparent函數嵌入由我處理一個窗口,一個外部進程的窗口,並可能遇到了我希望有人能幫助我的幾個問題外部進程用。首先,這裏是什麼,我目前在做我的窗口嵌入到應用程序中的輪廓:嵌入HWND到使用的setparent

HWND 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); 

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

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

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

回答

12

那麼,我終於找到了我的問題的答案。

要解決主應用程序失去焦點的問題,您需要使用AttachThreadInput函數將嵌入式窗口線程附加到主應用程序線程。

此外,人們可以使用TranslateAccelerator函數響應WM_KEYDOWN消息來確保主應用程序的加速器消息被觸發。

0

我使用WM_NACTIVE消息在Catch22.net上找到了一些相關信息。

它位於防止窗口停用部分。 希望有所幫助。

4

我不確定在近三年後您是否仍對這個話題感興趣。 我正在研究類似的應用程序。我的解決方案是在調用SetParent之前修改窗口樣式。有了這個解決方案,我不必調用AttachThreadInput。

但是,從外部進程託管子窗口的一個主要問題是,如果外部進程在響應用戶鍵盤或鼠標輸入時掛起,則主應用程序也會凍結。主應用程序中的消息循環仍在運行。但是,它不再接收用戶輸入事件。因此,它看起來好像掛了。我相信這是AttachThreadInput的直接結果,因爲兩個threades的輸入事件現在是同步的。如果其中一個被阻止,則兩者都被阻止。

0

我遇到了同樣的問題,仔細閱讀MSDN文檔後,我發現它很容易修復。

您應該刪除WS_POPUP,並添加WS_CHILD 你打電話的setParent

它在MSDN的說明:

出於兼容性考慮,的setparent不修改WS_CHILD或WS_POPUP窗口風格,其父母爲窗口正在改變。因此,如果hWndNewParent爲NULL,則應在調用SetParent後清除WS_CHILD位並設置WS_POPUP樣式。相反,如果hWndNewParent不爲NULL,並且窗口以前是桌面的子窗口,則應在清除WS_POPUP樣式並在調用SetParent之前設置WS_CHILD樣式。

https://msdn.microsoft.com/en-us/library/windows/desktop/ms633541(v=vs.85).aspx