使用的setparent各种问题嵌入窗户进入外部过程[复制](Various issues usin

2019-09-19 03:59发布

可能重复:
嵌入到HWND使用的setparent外部处理

我试图嵌入从我的过程中一个窗口,使用外部进程窗口SetParent功能和可能遇到了我希望有人能帮助我的几个问题。 首先,这里是什么,我目前在做我的窗口嵌入到应用程序中的轮廓:

WND 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);

此代码的工作和我的窗口出现在其他应用程序,但引入了以下问题:

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

有谁知道这些问题的解决方法? 我想对待我的窗口,就在主应用程序的另一个子窗口。

谢谢。

Answer 1:

当我的窗口获得输入焦点,外部进程的主要应用程序窗口失去焦点(即标题栏改变颜色)。

您需要使用AttachThreadInput到你的进程的线程附加到宿主进程的输入队列。 除了在所有附线程同步消息处理,这会导致他们共享焦点,异步键状态,活化,以及其他输入相关的属性。

主要应用的键盘快捷键的命令,而我的窗口具有焦点不起作用。

当你的窗口有键盘焦点,拥有你的窗口的线程接收来自系统的所有键盘消息。 如果你需要在主窗口的UI线程来处理加速器,你必须以某种方式路线键盘输入到该线程进行预处理。 你如何做到这一点,很大程度上取决于你所使用的应用程序的UI技术,以及如何你需要处理加速器。

构建跨越多个线程在不同的进程的用户界面是困难的,也有很多陷阱。



文章来源: Various issues using SetParent to embed window into external process [duplicate]