【问题标题】:Setting a HWND's lpfnWndProc from another process从另一个进程设置 HWND 的 lpfnWndProc
【发布时间】:2012-11-07 15:02:04
【问题描述】:

我有一个生成子进程的 win32 主应用程序。

目前我使用 CreateWindowEx 在主应用程序中创建一个 HWND,然后生成一个子进程。然后子进程使用 FindWindow 查找 HWND。我想在子进程中处理此 HWND 的 Window 消息(例如 WM_SIZE、WM_SETFOCUS 等),因此我尝试在子进程中设置 GWLP_WNDPROC 属性,但出现访问被拒绝错误,这是合理的。

我考虑直接在子进程中创建一个 HWND,但是当单击窗口时,主应用程序失去焦点,这对于我的用例来说是不可接受的。

有没有人建议如何做才能将注意力集中在主应用程序上,同时让子进程处理消息?

【问题讨论】:

  • 即使你可以从另一个进程中更改窗口过程,它也无济于事,因为子应用程序中的函数指针在主进程中是无效的,所以主进程将简单地崩溃下一个它收到消息的时间。为什么不让子进程向主进程的窗口发送消息说“请更改您的 WM_SIZE 和 WM_SETFOCUS 行为”?
  • 因为所有的消息处理都将在主应用程序中完成。子进程是自包含的,并且总是有一个与之关联的 HWND。主应用程序可以产生多个子进程。我的理想方案是让子进程创建 HWND,但单击它不会失去对主应用程序的关注。
  • 我怀疑您无法使这项工作令您满意。您通过整个方案试图解决的问题是什么,可能有更好的方法?
  • 请参阅我对 marcin_j 的回答的评论,了解我正在尝试做什么。

标签: c++ winapi hwnd


【解决方案1】:

SetWindowsHookEx 与其中一个窗口消息挂钩(例如WH_CALLWNDPROC) 用于拦截发送到其他窗口的消息,然后按相关窗口的HWND 过滤。

【讨论】:

  • 你能提供一些代码示例吗?我对winapi真的很陌生。谢谢。
【解决方案2】:

在您的子进程中,您可以使用 WS_NOACTIVATE 调用 ShowWindow。调用 CreateProcess 函数时,您可以指定 STARTUPINFO,如下所示:

si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNOACTIVATE;

您甚至可以将子应用程序中的焦点显式返回给主窗口。

我想您希望拥有与 Chromium 类似的设计。如果您仔细查看他们的设计文档:

http://www.chromium.org/developers/design-documents/inter-process-communication

你会看到他们确实在进程之间实现了IPC,但他们在主进程中没有单一的消息处理功能。

最后一个提示 - 与问题无关,在 windows 下阅读作业 - 这种机制允许对子进程进行更密切的控制。

【讨论】:

  • 是的,我的设计与 Chromium 的类似。具体来说,我有一个可以生成多个子进程的主应用程序(如 Chrome)。您可以将这些子进程中的每一个想象成 Chrome 中的选项卡。如果主应用程序调整大小,选项卡中的内容也需要调整大小。我尝试过的两个解决方案(但失败了): 1. 子进程创建 HWND - 当“选项卡”处于焦点时,这会导致主应用程序失去焦点 2. 主应用程序创建 HWND,子进程使用此 HWND 进行渲染.我无法拦截子进程中的事件(例如 WM_SIZE)。
  • 您可以在主应用程序中创建窗口,但在子进程中进行所有处理。当需要可视化某些内容时,子进程将原始图像发送到主应用程序以显示在其窗口中。实际上,您可以在此处使用映射内存,并让主进程在需要时读取它 - 因此不需要复制。通过这种方式,它简化了为了避免闪烁而需要的任何双缓冲。否则,每次主窗口移动时,您都必须跟踪子进程窗口,还要保持 z 顺序正确、聚焦等。
  • 如何让子进程进行处理?由于主应用程序当前拥有窗口过程,我是否需要将这些事件从主应用程序转发给子应用程序?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多