【问题标题】:Various issues using SetParent to embed window into external process [duplicate]使用 SetParent 将窗口嵌入外部进程的各种问题 [重复]
【发布时间】:2012-07-06 04:11:44
【问题描述】:

可能重复:
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);

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

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

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

谢谢。

【问题讨论】:

  • 我不确定这是正确的方法。很可能在一段时间后修复一个缺陷后,您会发现另一个问题......
  • 这并不容易。你有外部窗口的代码吗?尝试选择 MDI Child!让父级提供一个窗口作为子窗口的父窗口/框架会更容易。如果你有代码,有办法做到这一点。我相信你将不得不扩展资源链。你有机会让你的孩子处理一个 DLL 吗?
  • @Mark Hall:你是对的,它甚至看起来是一个精确的副本。

标签: c++ windows external window-management


【解决方案1】:

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

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

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

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

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

【讨论】:

  • @Mare Infinitus ,是的,这是 Mark Hall 的副本,我在我的应用程序中嵌入外部应用程序(如 notepad.exe)时遇到了同样的问题。
  • 感谢您的详细建议,我试了一下: DWORD dwPtyID = ::GetWindowThreadProcessId(hWnd,NULL);// hWnd 指示外部应用程序的句柄。 DWORD dwprocID = ::GetCurrentThreadId(); ::AttachThreadInput(dwprocID, dwPtyID, true);但这不起作用。再次感谢
  • “这不起作用”是什么意思?它在什么时候不起作用?你得到什么错误? (对于它的价值:尝试嵌入另一个您无法控制的应用程序可能不会很好地工作,如果有的话。)
猜你喜欢
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多