在 window 打开之前设置 window 的父级

SetParent of window before the window opened

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

  1. 我打开我的应用程序
  2. 我打开外部应用程序programmaticly
  3. 我使用 SetParent 在我的应用程序中托管它。

由于上面的流程,当外部应用程序打开时,我可以在 taskbar/task 管理器中看到它一瞬间(直到设置父级)。

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


编辑:
这是我的代码

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

在知道 window 句柄之前,您不能调用 SetParent()。创建其 window 的应用程序不可避免地也会导致创建任务栏按钮,无法覆盖它。 ProcessStartInfo.WindowStyle 可能 是您要求隐藏时的解决方法,但绝大多数应用程序都会忽略此请求。

您只能快速处理并使用与 shell 相同的机制来通知 window 正在创建。并领先于它,这需要 SetWindowsHookEx()。从 .NET 应用程序做起来非常痛苦,WH_SHELL 挂钩需要一个可以注入到进程中的 DLL,因此不能用 C# 编写。有一个 Codeproject.com 项目可以提供帮助,located here。它已经过时了,YMMV。