所以我试图做的是从我的程序启动资源管理器然后在资源管理器前弹出我的应用程序或者只是在我的应用程序后面启动资源管理器…
@H_502_17@解决方法
目前我有探险家开始然后我有动作将我的应用程序带到前面但探险家可能需要几秒钟才能开始,这会弄乱我的整个事件链.
这就是我目前正在做的事情:
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个项目的用户来说,这意味着生活质量的改变.
丑陋的方式
通常,在等待进程完成加载时,您可以调用
Process.WaitForInputIdle()
从MSDN开始:
Causes the Process component to wait indefinitely for the associated process to enter an idle state. This overload applies only to processes with a user interface and,therefore,a message loop.
使用explorer.exe时,这很可能无法正常工作,因为此过程通常会生成子进程并立即死亡.
解决方法是启动进程,Sleep for say,250-500ms,然后使用一些godawful hack找到新进程,然后在该进程上调用WaitForInputIdle.
替代
如果您愿意最小化explorer.exe,可以这样做:
ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = "explorer.exe"; psi.Arguments = "/separate"; psi.UseShellExecute = true; psi.WindowStyle = ProcessWindowStyle.Minimized; Process.Start(psi);