等待进程开始

Myt*_*ral 6 .net c# 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();
 }
Run Code Online (Sandbox Code Playgroud)

你可以解决这个问题的任何亮点将非常感激.

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

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

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

Rot*_*tem 6

丑陋的方式

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

Process.WaitForInputIdle()
Run Code Online (Sandbox Code Playgroud)

来自MSDN:

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

有了explorer.exe这将最有可能行不通,因为这样的过程通常会生成一个子进程,并立即死亡.

解决方法是启动这个过程,Sleep比如250-500ms,然后Process使用一些神经质的黑客找到新的,然后调用WaitForInputIdle它Process.

替代

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

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

  • 要么是这个,要么在开始流程之前在表单上注册LostFocus事件一小段时间.即注册一个新的LostFocus事件,在你失去焦点的情况下将焦点设置回你的表格,启动过程,启动一个计时器,其唯一目的是删除你在500ms或其他任意时间之后注册的LostFocus事件. (4认同)