C++ 设置HWND';从另一个进程删除lpfnWndProc

C++ 设置HWND';从另一个进程删除lpfnWndProc,c++,winapi,hwnd,C++,Winapi,Hwnd,我有一个生成子进程的win32主应用程序 目前,我使用CreateWindowEx在主应用程序中创建HWND,然后生成一个子进程。然后,子进程使用FindWindow查找HWND。我希望在子进程中处理此HWND的窗口消息(例如WM_大小、WM_设置焦点等),因此我尝试在子进程中设置GWLP_WNDPROC属性,但我遇到了一个访问拒绝错误,这是合理的 我考虑直接在子进程中创建一个HWND,但是当单击窗口时,主应用程序会失去焦点,这对于我的用例来说是不可接受的 在让子进程处理消息的同时,是否有人对如

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

目前,我使用CreateWindowEx在主应用程序中创建HWND,然后生成一个子进程。然后,子进程使用FindWindow查找HWND。我希望在子进程中处理此HWND的窗口消息(例如WM_大小、WM_设置焦点等),因此我尝试在子进程中设置GWLP_WNDPROC属性,但我遇到了一个访问拒绝错误,这是合理的

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


在让子进程处理消息的同时,是否有人对如何保持对主应用程序的关注有什么建议?

使用带有一个windows消息挂钩(例如
WH_CALLWNDPROC)
setWindowshookx
来拦截发送到其他窗口的消息,然后按相关窗口的HWND进行过滤。

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

si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNOACTIVATE;
您甚至可以显式地将子应用程序中的焦点返回主窗口

我想你想要一个和chromium相似的设计。如果您仔细查看他们的设计文档:

您将看到,它们确实在进程之间实现了IPC,但在主进程中并没有单一的消息处理功能


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

即使您可以从另一个进程更改窗口过程,也不会有帮助,因为子应用程序中的函数指针在主进程中无效,因此,主进程在下次收到消息时将崩溃。为什么不让子进程向主进程的窗口发送一条消息,说“请更改您的WM_大小和WM_设置焦点行为”?因为这样所有的消息处理都将在主应用程序中完成。子进程应该是自包含的,并且始终有一个与之关联的HWND。主应用程序可以生成多个子进程。我的理想方案是让子进程创建HWND,但单击它不会失去对主应用程序的关注。我怀疑您将无法使这项工作达到您的满意程度。通过执行整个方案,您试图解决的问题是什么?可能有更好的方法?请参考我对marcin_j回答的评论,了解我具体尝试的内容。是的,我的设计与Chromium的类似。具体来说,我有一个主应用程序(比如Chrome),可以生成多个子进程。您可以将这些子进程想象为Chrome中的选项卡。如果主应用程序调整了大小,则选项卡中的内容也需要调整大小。我尝试过(但失败了)两种解决方案:1。子进程创建HWND-这会导致主应用程序在“选项卡”处于焦点2时失去焦点。主应用程序创建HWND,子进程使用此HWND渲染到。我无法在子进程中截获事件(例如WM_大小)。您可以在主应用程序中创建窗口,但在子进程中执行所有处理。当某些东西需要可视化时,子进程将原始图像发送到主应用程序,并显示在其窗口中。实际上,您可以在这里使用映射内存,并在需要时让主进程读取它—所以不需要复制。通过这种方式,它简化了为避免闪烁而需要的任何双缓冲。否则,每次主窗口移动时,您都必须跟踪子进程窗口,同时保持z顺序正确、焦点等。如何让子进程进行处理?我是否需要将这些事件从主应用程序转发到子应用程序上,因为主应用程序当前拥有窗口过程?能否提供一些代码示例?我对winapi真的很陌生。谢谢