免责声明: 我并不熟悉Win32 API,尤其是窗口如何工作。
我想将某个进程的窗口作为另一个进程的子窗口。这两个进程也有父子关系,但我认为这并不重要。到目前为止,一切都像魔法一样顺利 - 直到我冻结了子窗口的主线程。
想象一个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关于SetParent的文章所建议的,我也清除了WS_POPUP
样式属性并添加了一个WS_CHILD
属性。由于这也没有帮助,我还通过使用SetWindowLongPtr
命令添加了一个WS_EX_NOACTIVATE
扩展样式属性。最后,我尝试向两个窗口发送WM_UPDATEUISTATE
和WM_CHANGEUISTATE
消息,但这也没有改变什么。
令我困惑的是,父进程的窗口在没有触摸它之前仍然正常绘制,然后完全冻结,直到子窗口解冻。我怀疑这是一种称为“输入队列”的东西。MSDN关于WM_ACTIVATE消息的文章中有述:
发送给正在激活的窗口和正在停用的窗口。如果窗口使用相同的输入队列,则将消息同步地发送,首先发送到正在停用的顶级窗口的窗口过程,然后发送到正在激活的顶级窗口的窗口过程。如果窗口使用不同的输入队列,则将消息异步地发送,因此窗口立即激活。
由于这个原因,我对WS_EX_NOACTIVATE
扩展样式属性寄予厚望。
总结一下:实际上有可能托管另一个进程的窗口而在子窗口冻结时不冻结自己的窗口吗?