免责声明:我不熟悉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扩展样式属性寄予厚望.
总结一下:实际上可以托管另一个进程的窗口,并在子窗口冻结时不冻结自己的窗口吗?
我正在尝试使用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);
Run Code Online (Sandbox Code Playgroud)
此代码有效,我的窗口出现在另一个应用程序中,但引入了以下问题:
有人知道解决方法吗?我希望我的窗口被视为主应用程序的另一个子窗口.