相关疑难解决方法(0)

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

免责声明:我不熟悉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
查看次数

使用SetParent将HWND嵌入到外部进程中

我正在尝试使用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)

此代码有效,我的窗口出现在另一个应用程序中,但引入了以下问题:

  • 当我的窗口获得输入焦点时,外部进程的主应用程序窗口失去焦点(即标题栏改变颜色)
  • 当我的窗口具有焦点时,主应用程序的键盘快捷键命令不起作用

有人知道解决方法吗?我希望我的窗口被视为主应用程序的另一个子窗口.

c winapi

17
推荐指数
1
解决办法
7743
查看次数

标签 统计

winapi ×2

c ×1

delphi ×1

window ×1