windows - 好还是坏 - 不同进程之间的 SetParent() win32 API

标签 windows winapi

SetParent 函数接受子窗口句柄和新的父窗口句柄。 当子窗口处于不同的 Windows 进程中时,这似乎也有效。

我看过a post声称这不受官方支持,但是 current docs别再提这个了。这是当前文档中的缺陷,还是这种行为发生了变化?

HWND WINAPI SetParent(
  __in      HWND hWndChild,
  __in_opt  HWND hWndNewParent
);

最佳答案

可以与不同进程中的窗口建立父子关系。让它在所有情况下都能正常工作是很棘手的。您可能需要调试各种奇怪的症状。

通常,不同进程中的窗口会使用不同的消息泵从不同的输入队列中获取它们的消息。当您对另一个进程中的窗口使用 SendMessage 时,它实际上被发布到另一个窗口的队列中,在那里进行处理,并且返回被有效地编码回原始进程。因此,如果其中一个进程停止处理消息,您也可以有效地锁定另一个进程。 (即使在一个进程中,当窗口是在不同的线程上创建的并且线程队列没有被附加时,也是如此。)

但是当您在不同线程中的窗口之间设置父/子关系时,Windows 将这些输入队列附加在一起,强制消息处理是同步的。你不再处于正常情况,但你面临同样的问题:一个窗口的处理挂起实际上挂起另一个进程。

注意在参数中传递指针的消息。这些指针在接收过程中将无效。 (有几个异常(exception),例如 WM_COPYDATA,它会为您重新创建接收过程中的数据。但即使是那些也有局限性。)

当 window 被破坏时,你必须特别小心。如果可能,请在销毁任一窗口之前断开父子关系。如果不可能,那么最好在销毁父窗口之前手动销毁子窗口。通常,销毁父级会导致子级自动销毁,但当子级在另一个进程(或未附加的线程)中时很容易挂起。

在较新版本的 Windows (Vista+) 中,如果进程以不同的完整性级别运行,您也可能会遇到一些安全问题。

感谢 IInspectable 指出了我之前回答中的错误。

关于windows - 好还是坏 - 不同进程之间的 SetParent() win32 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3459874/

相关文章:

Windows 7 上 png_set_read_fn() 崩溃

c# - 计算 Windows 中特定进程的上下文切换

c - 程序不读取整个文件

winapi - 如何指定与 mciSendString API 一起使用的声卡

c++ - 调用 GetOpenFileNameA 导致常见对话框错误 2

c++ - 让两个窗口毫不拖延地粘在一起

c++ - 将Win32对话框中的图标设置为默认图标

c++ - Mini Filter 驱动程序与 Windows 服务的通信

Objective-C 编译器和编辑器

windows - 编写设备驱动程序?