我正在开发类似Chrome的应用程序。我有两个应用程序Say Parent和Child Application。子应用程序包含菜单。当我将子应用程序的实例附加到父应用程序的选项卡时。单击鼠标时不显示子应用程序中的菜单。
用于附加过程的代码段是
Process P = Process.GetProcessesByName("Child");
P.WaitForInputIdle();
IntPtr handle = P.MainWindowHandle;
SetParent(handle, this.tabPage1.Handle);
MoveWindow(handle, rec.X, rec.Y, rec.Width, rec.Height, true);
我无法对Child应用程序进行任何更改。
答案 0 :(得分:0)
根据MSDN:
“使用WaitForInputIdle()强制应用程序的处理等待,直到消息循环返回到空闲状态。当具有用户界面的进程正在执行时,每次发送Windows消息时都会执行其消息循环然后,进程返回到消息循环。当一个进程在消息循环内等待消息时,该进程被称为处于空闲状态。这种状态很有用,例如,当你的应用程序需要时在应用程序与该窗口通信之前等待启动过程完成创建主窗口。
如果进程没有消息循环,WaitForInputIdle()将抛出InvalidOperationException。
WaitForInputIdle()重载指示Process组件无限期地等待进程在消息循环中变为空闲。此指令可能导致应用程序停止响应。例如,如果写入进程总是立即退出其消息循环,就像代码片段while(true)一样。“
因此,我认为你应该考虑评论P.WaitForInputIdle();
答案 1 :(得分:0)
经过一些研究,我能够找到解决方案。
解决方案
在调用SetParent之前,我们应该使用Windows API的SetWindowLongPtr更新窗口样式。 最终代码如下
long style = WinAPI.GetWindowLongPtr(new HandleRef(this,console.MainWindowHandle), WinAPIConstants.GWL_STYLE).ToInt64();
style= style & ~(WinAPIConstants.WS_CAPTION |
WinAPIConstants.WS_BORDER |
WinAPIConstants.WS_DLGFRAME);
IntPtr styleValue = new IntPtr(style);
Rectangle displayRectangle = newTab.DisplayRectangle;
// Removing the title bar and border.
WinAPI.SetWindowLongPtr(new HandleRef( this,console.MainWindowHandle),
WinAPIConstants.GWL_STYLE, styleValue);
style = WinAPI.GetWindowLongPtr(new HandleRef(this, console.MainWindowHandle), WinAPIConstants.GWL_STYLE).ToInt64();
style &= ~WinAPIConstants.WS_POPUP;
style |= WinAPIConstants.WS_CHILD;
styleValue = new IntPtr(style);
// Setting window to be child of current application and the popup behaviour of window is removed.
WinAPI.SetWindowLongPtr(new HandleRef(this, console.MainWindowHandle), WinAPIConstants.GWL_STYLE, styleValue);
// Attach the console to the tab.
WinAPI.SetParent(console.MainWindowHandle, newTab.Handle);
谢谢
Vipin Kumar Mallaya。