等待进程开始

时间:2013-08-21 13:51:30

标签: c# .net visual-studio-2012

所以我试图做的是从我的程序启动资源管理器,然后在资源管理器前面弹出我的应用程序,或者只是在我的应用程序后启动资源管理器......

目前我有探险家开始,然后我有动作将我的应用程序带到前面但探险家可能需要几秒钟才能开始,这会弄乱我的整个事件链。

这就是我目前正在做的事情:

 Process process = new Process();
 process.StartInfo.FileName = environmentVariable + "\\explorer.exe";
 process.StartInfo.Arguments = !string.IsNullOrEmpty(this.uxMainFolder.Text) ? this.uxMainFolder.Text + "\\" + path2 : Path.Combine("R:\\Project", path2);

 try
 {
      process.Start();

      this.WindowState = FormWindowState.Minimized;
      this.Show();
      this.WindowState = FormWindowState.Normal;
 }
 finally
 {
      process.Dispose();
 }

你可以对这个问题有所了解。

编辑:我正在寻找一些可以在加载资源管理器后调用TopMost或我的最小化/显示/正常方法的事件。

该程序生成一个项目目录,其中包含每个项目类型的所有必需文档,并在资源管理器中弹出该目录。

对于想要一次创建10个或20个项目的用户来说,这意味着改变生活质量。

1 个答案:

答案 0 :(得分:6)

丑陋的方式

通常,在等待进程完成加载时,您可以调用

Process.WaitForInputIdle()

来自MSDN

  

使Process组件无限期地等待关联进程进入空闲状态。此重载仅适用于具有用户界面的进程,因此也适用于消息循环。

使用explorer.exe这很可能不起作用,因为这个过程经常会产生一个子进程并立即死亡。

解决方法是启动流程,Sleep,例如,250-500毫秒,然后使用一些神经质的黑客找到新的Process,然后在WaitForInputIdle上调用Process 1}}。

另类

如果您愿意最小化explorer.exe,可以这样做:

ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "explorer.exe";
psi.Arguments = "/separate";
psi.UseShellExecute = true;
psi.WindowStyle = ProcessWindowStyle.Minimized;
Process.Start(psi);