免責聲明:我不熟悉Win32 API,特別是Windows如何工作。當子窗口凍結時,父窗口凍結,雖然它來自另一個進程
我想使某個進程的窗口成爲另一個進程的子窗口。這兩個過程也是父母和孩子。但我認爲這不重要。到目前爲止,一切都像魅力一樣 - 直到我凍結了子窗口的主線程。
想象一個container.exe是「主機」的notepad.exe和someApplication.exe
當我暫停someApplication.exe的主線程幾秒鐘,它的窗口被凍結該金額的時間。這完全可以理解。但container.exe的窗口將也掛在同一時間。其他託管進程的子窗口(如notepad.exe)將繼續正常工作。
我使用SetParent
命令使常規的非子窗口我container.exe的孩子:
SetParent(
childProcess.HWND,
myOwnHWND
);
在那之後,我使用setWindowPos
:
SetWindowPos(
childProcess.HWND,
HWND_TOP,
someXPos,
someYPos,
0,
0,
SWP_FRAMECHANGED or SWP_NOSIZE or SWP_SHOWWINDOW
)
由於MSDN article on SetParent建議,我也清除WS_POPUP
樣式屬性並添加一個WS_CHILD
屬性。既然這也沒有幫助,我還通過使用SetWindowLongPtr
命令添加了WS_EX_NOACTIVATE
擴展樣式屬性。最後,我試着發送兩個窗口,一個是WM_UPDATEUISTATE
,然後是一個WM_CHANGEUISTATE
消息,但這也沒有改變一件事。
令我迷惑的是,父進程的窗口繼續正常繪製,直到我觸摸它。然後它完全凍結,直到子窗口解凍。我懷疑一個叫做'輸入隊列'的東西。 MSDN article約WM_ACTIVATE
消息狀態:
發送到正在激活窗口和窗口被停用。如果窗口使用相同的輸入隊列,則同步發送消息,首先到頂層窗口的窗口過程被停用,然後到頂層窗口的窗口過程被激活。如果窗口使用不同的輸入隊列,則消息將異步發送,因此窗口會立即激活。
正因爲如此,我曾經爲WS_EX_NOACTIVATE
擴展樣式屬性寄予厚望。
綜上所述:實際上可以託管另一個進程的窗口,並且在子窗口凍結時不凍結自己的窗口?
+1這個問題令人難以置信的徹底。 –
相關閱讀:[呼叫是否有跨進程的父母/子女或擁有者/擁有的窗口關係是合法的?](http://blogs.msdn.com/b/oldnewthing/archive/2013/04/12/10410454 .aspx) – GSerg
*爲什麼*你需要這樣做?我確信有更好更簡單的方法來實現您的實際目的。不要陷入XY問題陷阱。 –