该SetParent
函数采用子和新的父窗口句柄.当子窗口处于不同的Windows进程时,这似乎也有效.
我看到一篇帖子声称这不是官方支持的,但目前的文档不再提及此了.这是当前文档中的缺陷,还是这种行为发生了变化?
HWND WINAPI SetParent(
__in HWND hWndChild,
__in_opt HWND hWndNewParent
);
Run Code Online (Sandbox Code Playgroud)
Adr*_*thy 26
您可以在不同进程中与窗口建立父子关系.在所有情况下让它正常工作是很棘手的.您可能需要调试各种奇怪的症状.
通常,单独进程中的窗口将使用单独的消息泵从单独的输入队列获取其消息.当您SendMessage
在另一个进程中使用某个窗口时,它实际上会发布到另一个窗口的队列中,在那里进行处理,并且返回被有效地封送回原始进程.因此,如果其中一个进程停止处理消息,您也可以有效地锁定另一个进程.(即使在不同线程上创建窗口且未附加线程队列的过程中也是如此.)
但是当您在不同线程的窗口之间设置父/子关系时,Windows会将这些输入队列连接在一起,从而迫使消息处理同步.您不再是正常情况,但是您遇到了同样的问题:在一个窗口的处理过程中挂起会有效地挂起另一个进程.
注意在params中传递指针的消息.指针在接收过程中无效.(有一些例外,例如WM_COPYDATA
,它会在接收过程中为您重新创建数据.但即使这些也有局限性.)
当窗户被摧毁时,你必须特别小心.如果可能,请在销毁任一窗口之前断开父子关系.如果不可能,则最好在销毁父窗口之前手动销毁子窗口.通常,销毁父级会导致子级被自动销毁,但是当子级处于另一个进程(或未连接的线程)时,很容易挂起.
在较新版本的Windows(Vista +)中,如果进程以不同的完整性级别运行,您还可以获得一些安全性速度提升.
感谢IInspectable,他在我之前的回答中指出了一个错误.
归档时间: |
|
查看次数: |
13541 次 |
最近记录: |