C#启动explorer.exe后WaitForExit()失效问题如何解决?
问题原因
- Windows 资源管理器
explorer.exe默认启用单实例运行机制:当系统中已经存在运行中的explorer进程时,新发起的explorer启动请求会被转交给已存在的实例处理,你启动的临时进程会在完成请求转发后立即退出,因此你拿到的explore进程对象对应的是已经快速退出的临时进程,WaitForExit()会直接返回,无法关联到实际显示窗口的常驻explorer进程。 - 即便你是通过explorer打开指定路径/特定文件窗口,默认逻辑下也会复用现有实例,新启动的进程不会对应实际的窗口进程。
修复方案
推荐通过添加explorer的命令行启动参数/separate强制启动独立实例,这样你启动的进程会直接对应实际的窗口进程,WaitForExit()即可正常生效。
参考代码
// 配置启动参数 ProcessStartInfo startInfo = new ProcessStartInfo { FileName = "explorer.exe", // 不需要打开指定路径的话,Arguments属性仅填写"/separate"即可 Arguments = @"/separate C:\Users\Public", UseShellExecute = false }; // 启动进程并等待退出 using (Process explore = Process.Start(startInfo)) { explore.WaitForExit(); // 此处可添加进程退出后的后续业务逻辑 Console.WriteLine("资源管理器窗口已关闭"); }
如果你需要保持默认单实例启动逻辑,不想用
/separate参数,可以在启动后通过枚举系统进程的方式,按启动时间、窗口标题、打开路径等规则匹配到对应explorer进程后再调用WaitForExit(),不过该方式稳定性低于独立实例启动方案。
内容的提问来源于stack exchange,提问作者cgaskey
相关产品推荐
相关产品推荐

