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

时间:2010-08-11 15:13:12

标签: windows winapi

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

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

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

2 个答案:

答案 0 :(得分:24)

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

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

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

注意在params中传递指针的消息。指针在接收过程中无效。 (有一些例外,例如WM_COPYDATA,它会在接收过程中为您重新创建数据。但即使这些也有局限性。)

当窗户被摧毁时,你必须特别小心。如果可能,请在销毁任一窗口之前断开父子关系。如果不可能,则最好在之前手动销毁子窗口。通常,销毁父级会导致子级被自动销毁,但是当子级处于另一个进程(或未连接的线程)时,很容易挂起。

在较新版本的Windows(Vista +)中,如果进程以不同的完整性级别运行,您还可以获得一些安全速度提升。

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

答案 1 :(得分:0)

只需从子窗口中删除WS_CHILDWINDOW。避免锁。
抱歉,没有帮助