小编Gün*_*ful的帖子

当子窗口从另一个进程冻结时,父窗口会冻结

免责声明:我不熟悉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)

正如关于SetParentMSDN文章所示,我还清除了WS_POPUPstyle属性并添加了一个WS_CHILD属性.由于这也没有帮助,我还WS_EX_NOACTIVATE通过使用SetWindowLongPtr命令添加了扩展样式属性.最后,我尝试发送两个窗口WM_UPDATEUISTATE然后WM_CHANGEUISTATE发送消息,但这也没有改变一件事.

令我困惑的是,父进程的窗口继续正常绘制,直到我触摸它.然后它完全冻结,直到子窗口解冻.我怀疑称为"输入队列"的东西.有关消息的MSDN文章WM_ACTIVATE指出:

发送到正在激活的窗口和停用的窗口.如果窗口使用相同的输入队列,则同步发送消息,首先发送到被停用的顶级窗口的窗口过程,然后发送到被激活的顶级窗口的窗口过程.如果窗口使用不同的输入队列,则会异步发送消息,因此会立即激活窗口.

因此,我对WS_EX_NOACTIVATE扩展样式属性寄予厚望.

总结一下:实际上可以托管另一个进程的窗口,并在子窗口冻结时不冻结自己的窗口吗?

delphi winapi window

25
推荐指数
1
解决办法
2047
查看次数

标签 统计

delphi ×1

winapi ×1

window ×1