我正在为复杂的应用程序开发一个多进程框架。 Host进程充当容器,可以从中生成一个或多个guest虚拟机进程。 这样的客户进程的窗口被重新定位到主机的窗口(例如笔记本tabSheet)。 (InterProcess Communication在这里不是问题 - 它有效) 想象一下类似谷歌Chrome的东西。 我已经阅读了很多关于跨进程重新编写窗口的答案,但我无法弄清楚在这种情况下发生了什么:
WaitForMultipleObjects
; MessageBox
,但挂起。guest虚拟机进程是否在单独的邮件队列上运行?我错过了什么?
我认为在嵌入访客表单时,我遵循了SetParent
的最佳指南:
SetWindowLong(GuestHWnd, GWL_STYLE, GetWindowLong(GuestHWND, GWL_STYLE) and WS_EX_NOPARENTNOTIFY and (not WS_POPUP) or WS_CHILD);
SetParent(GuestHWnd, HostHWnd);
PostMessage(GuestHWnd, WM_UPDATEUISTATE, UIS_INITIALIZE, 0);
SendMessage(HostHWnd, WM_UPDATEUISTATE, UIS_INITIALIZE, 0);
SetWindowPos(GuestHWnd, 0, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER or SWP_FRAMECHANGED);
另请注意,我没有调用任何类型的AttachThreadInput
。
如果主机未被阻止,或者访客窗口不是主机的孩子(显然),则不会出现此问题。
谢谢。
答案 0 :(得分:1)
我只能推荐Raymond chen的解释:http://blogs.msdn.com/b/oldnewthing/archive/2013/04/12/10410454.aspx
长话短说:
创建跨线程父/子或所有者/拥有窗口 relationship隐式地附加了线程的输入队列 那些窗户属于。
问题出在这句话中:
另请注意,我还没有调用任何类型的AttachThreadInput。该 如果未阻止主机或访客,则不会出现问题 窗口不是主持人的孩子(显然)。
由于它是子/父关系,因此存在隐式的AttachThreadInput。