【发布时间】:2017-11-30 13:22:36
【问题描述】:
当我尝试像这样从 c# 启动 explorer.exe 时,我有一个奇怪的行为:
ProcessStartInfo info = new ProcessStartInfo("explorer.exe", "E:");
info.WindowStyle = ProcessWindowStyle.Hidden;
Process process = new Process();
process.StartInfo = info;
process.Start();
Thread.Sleep(2000);
bool res = process.CloseMainWindow(); // InvalidOperationException -> already exited
process.Close();
process.WaitForExit(5000);
问题是:
这个异常似乎是正确的,因为此时HasExited 已经返回true。尽管如此,在任务管理器中创建的资源管理器实例仍然存在。
所以我不明白我的电话是做什么的。我原以为它会直接启动资源管理器的一个实例,但似乎没有,或者资源管理器以某种不同的方式工作。
我的第二个问题是:如何以编程方式启动并在此之后立即停止资源管理器的新特定实例?
编辑 回答一些问题:
- 资源管理器选项
Launch Folder Windows in a separate process设置为 true - 创建的
process.Id不在任务管理器中。例如:taskmanager 中显示的新资源管理器实例的 PID 为 4968,而调试器显示 10752 作为已创建(和退出)进程的 ID。
【问题讨论】:
-
the created instance of explorer is still present.你确定它是资源管理器的created instance,还是只是默认的一直在运行? -
process.Close(); process.WaitForExit(5000);为什么会有 process.Close() 那里 -
@mjwills 是的,我确定,它是创建的实例。
-
@MethodMan 来自 MSDN 示例
-
不要被任务管理器误导,资源管理器会为其主窗口中的每个选项卡创建一个进程。 Explorer 是一个单实例进程。如果您再次启动它,它只会要求第一个实例显示 URL。并退出。功能,而不是错误。使用 IShellWindows 接口查找正在运行的实例。
标签: c# windows-10 windows-explorer