6

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

目前我有资源管理器启动然后我有操作将我的应用程序带到前面但是资源管理器可能需要几秒钟才能启动,这会打乱我的整个事件链。

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

 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 个项目的用户来说,这意味着生活质量的改变。

4

1 回答 1

7

丑陋的方式

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

Process.WaitForInputIdle()

来自MSDN

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

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

解决方法是启动进程,Sleep例如 250-500 毫秒,然后Process使用一些可怕的 hack 找到新进程,然后调用WaitForInputIdleProcess

替代

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

ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "explorer.exe";
psi.Arguments = "/separate";
psi.UseShellExecute = true;
psi.WindowStyle = ProcessWindowStyle.Minimized;
Process.Start(psi);
于 2013-08-21T14:01:22.667 回答