窗口打开前窗口的SetParent

时间:2015-06-14 17:19:05

标签: c# wpf setparent windowsformhost

我正在使用SetParent在我的应用中托管外部应用(使用WindowsFormHost)。
流程是这样的:

  1. 我打开我的应用
  2. 我打开外部应用programmaticly
  3. 我使用SetParent在我的应用程序中托管它。
  4. 由于上面的流程,当外部应用程序打开时,我可以在任务栏/任务管理器中看到它一瞬间(直到设置了父项)。

    我可以以某种方式更改它首先设置父级然后打开应用程序的顺序吗?我想要的只是避免我刚才描述的内容 如果您对我的问题有任何其他解决方案,我会很乐意接受它。


    修改
    这是我的代码

    string strPres = @"C:\Users\Ron\Desktop\Create an Office Mix.pptx";
    oPPT = new Microsoft.Office.Interop.PowerPoint.Application();
    oPPT.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
    objPresSet = oPPT.Presentations;
    objPres = objPresSet.Open(strPres, MsoTriState.msoFalse,
                MsoTriState.msoFalse, MsoTriState.msoTrue);
    objPres.SlideShowSettings.ShowType = Microsoft.Office.Interop.PowerPoint.PpSlideShowType.ppShowTypeWindow;
    objPres.SlideShowSettings.Run();
    
    objPres.Windows[1].Close();
    objPres.Saved = MsoTriState.msoTrue;
    
    uint oPPTID;
    GetWindowThreadProcessId(new IntPtr(oPPT.HWND),  out oPPTID);
    _process = Process.GetProcessById((int)oPPTID);
    _process.WaitForInputIdle();
    SetParent(_process.MainWindowHandle, _panel.Handle);
    

1 个答案:

答案 0 :(得分:2)

在知道窗口句柄之前,不能调用SetParent()。创建窗口的应用程序也不可避免地导致任务栏按钮被创建,无法覆盖它。当你要求隐藏时,ProcessStartInfo.WindowStyle 可以成为一种解决方法,除了绝大多数应用都忽略了这个请求。

您只能快速了解它并使用shell用来注意创建窗口的相同机制。并且要领先于它,这需要SetWindowsHookEx()。从.NET应用程序来看非常痛苦,WH_SHELL挂钩需要一个可以注入进程的DLL,因此无法用C#编写。有一个Codeproject.com项目有帮助,located here。这是相当陈旧的,YMMV。