免责声明:我不熟悉Win32 API,尤其是Windows的工作方式.
我想让某个进程的窗口成为另一个进程的子窗口.这两个过程也是父母和孩子.但我认为不重要.到目前为止,一切都像魅力一样 - 直到我冻结子窗口的主线程.
想象一下一个"托管"notepad.exe和someApplication.exe的container.exe
当我暂停someApplication.exe的主线程几秒钟时,它的窗口会被冻结一段时间.这完全可以理解.但是container.exe的窗口也会同时挂起.其他托管进程(如notepad.exe)的子窗口将继续正常工作.
我正在使用该SetParent命令使常规非子窗口成为我的container.exe的子项:
SetParent(
childProcess.HWND,
myOwnHWND
);
Run Code Online (Sandbox Code Playgroud)
在那之后,我正在使用setWindowPos:
SetWindowPos(
childProcess.HWND,
HWND_TOP,
someXPos,
someYPos,
0,
0,
SWP_FRAMECHANGED or SWP_NOSIZE or SWP_SHOWWINDOW
)
Run Code Online (Sandbox Code Playgroud)
正如关于SetParent的MSDN文章所示,我还清除了WS_POPUPstyle属性并添加了一个WS_CHILD属性.由于这也没有帮助,我还WS_EX_NOACTIVATE通过使用SetWindowLongPtr命令添加了扩展样式属性.最后,我尝试发送两个窗口WM_UPDATEUISTATE然后WM_CHANGEUISTATE发送消息,但这也没有改变一件事.
令我困惑的是,父进程的窗口继续正常绘制,直到我触摸它.然后它完全冻结,直到子窗口解冻.我怀疑称为"输入队列"的东西.有关消息的MSDN文章WM_ACTIVATE指出:
发送到正在激活的窗口和停用的窗口.如果窗口使用相同的输入队列,则同步发送消息,首先发送到被停用的顶级窗口的窗口过程,然后发送到被激活的顶级窗口的窗口过程.如果窗口使用不同的输入队列,则会异步发送消息,因此会立即激活窗口.
因此,我对WS_EX_NOACTIVATE扩展样式属性寄予厚望.
总结一下:实际上可以托管另一个进程的窗口,并在子窗口冻结时不冻结自己的窗口吗?