使用SetParent将窗口嵌入外部进程的各种问题

时间:2012-07-06 04:11:44

标签: c++ windows external window-management

  

可能重复:
  Embedding HWND into external process using 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);

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

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

是否有人知道这些问题的解决方法?我希望我的窗口可以被视为主应用程序的另一个子窗口。

感谢。

1 个答案:

答案 0 :(得分:1)

  

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

您需要使用AttachThreadInput将进程的线程附加到主机进程的输入队列。除了在所有连接的线程上同步消息处理之外,这还会使它们共享焦点,异步键状态,激活和其他与输入相关的属性。

  

当我的窗口具有焦点时,主应用程序的键盘快捷键命令不起作用。

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

构建跨越不同进程中多个线程的用户界面很困难,并且存在许多缺陷。