好或坏 – SetParent()win32 API在不同的进程之间

SetParent函数需要一个子窗口和新的父窗口句柄。 当子窗口处于不同的Windows进程中时,这也似乎工作。

我曾看过一篇声称这不是官方支持的post ,但目前的文档没有提到这一点。 这是目前文件中的缺陷,还是这种行为改变?

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

Solutions Collecting From Web of "好或坏 – SetParent()win32 API在不同的进程之间"

可以在不同的进程中与窗口建立亲子关系。 在任何情况下都能正常工作很困难。 您可能需要调试各种奇怪的症状。

通常,单独进程中的窗口将使用单独的消息泵从单独的输入队列中获取消息。 当您使用SendMessage到另一个进程中的窗口时,它实际上被发送到其他窗口的队列中,在那里处理,并且返回被有效地封送回原始进程。 因此,如果其中一个进程停止处理消息,则可以有效地锁定另一个消息。 (即使在不同的线程上创建窗口并且没有连接线程队列的过程中也是如此)。

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

注意传递参数中的指针的消息。 指针在接收过程中不会有效。 (有几个例外,如WM_COPYDATA ,在接收过程中为您重新创建数据,但即使这些也有限制)。

当窗户被毁坏时,你必须特别小心。 如果可能,请在销毁任一窗口之前断开父子关系。 如果这是不可能的,那么最好在销毁父代之前手动销毁子窗口。 通常情况下,销毁父母会导致孩子被自动销毁,但是当孩子在另一个进程(或未挂接的线程)时很容易挂起。

在较新版本的Windows(Vista +)中,如果进程以不同的完整性级别运行,还可以达到一些安全性高速缓存。

感谢在我以前的答案中指出了错误的IInspectable。