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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

我试图使用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);

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

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

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

提问于
用户回答回答于

要解决主要应用程序失去焦点的问题,你需要使用AttachThreadInput函数将嵌入式窗口线程附加到主应用程序线程。

此外,可以使用TranslateAccelerator函数响应WM_KEYDOWN消息来确保主应用程序的加速器消息被触发。

用户回答回答于

我的解决方案是在调用SetParent之前修改窗口样式。有了这个解决方案,我不必调用AttachThreadInput。

但是,从外部进程托管子窗口的一个主要问题是,如果外部进程在响应用户键盘或鼠标输入时挂起,则主应用程序也会冻结。主应用程序中的消息循环仍在运行。但是,它不再接收用户输入事件。因此,它看起来好像挂了。我相信这是AttachThreadInput的直接结果,因为两个threades的输入事件现在是同步的。如果其中一个被阻止,则两者都被阻止。

扫码关注云+社区