1

我正在开发一个类似 chrome 的应用程序。我确实有两个应用程序说父应用程序和子应用程序。子应用程序包含菜单。当我将子应用程序的实例附加到父应用程序的选项卡时。单击鼠标时不显示子应用程序中的菜单。

用于附加过程的代码片段是

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);

我无法对子应用程序进行任何更改。

4

2 回答 2

0

根据 MSDN:

“使用WaitForInputIdle()强制你的应用程序的处理等待直到消息循环返回到空闲状态。当一个带有用户界面的进程正在执行时,它的消息循环在每次Windows消息发送到进程时执行操作系统。然后进程返回到消息循环。当进程在消息循环内等待消息时,称为处于空闲状态。这种状态很有用,例如,当您的应用程序需要等待在应用程序与该窗口通信之前完成创建其主窗口的启动过程。

如果进程没有消息循环,WaitForInputIdle() 会抛出 InvalidOperationException。

WaitForInputIdle() 重载指示进程组件无限期地等待进程在消息循环中变为空闲状态。此指令可能会导致应用程序停止响应。例如,如果进程被写入总是立即退出其消息循环,如代码片段 while(true) 中所示。”

因此,我认为您应该考虑发表评论P.WaitForInputIdle();

于 2012-11-07T06:53:25.313 回答
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。

于 2013-04-26T10:43:25.013 回答