启动和关闭 explorer.exe 实例

卡西奥斯姆

当我尝试从 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的不存在于任务管理器中。例如:任务管理器中显示的新资源管理器实例的 PID 为 4968,而调试器显示 10752 作为创建(和退出)进程的 ID。

编辑:这里是 ~12 次调试运行后任务管理器的屏幕截图在此处输入图片说明

网络版

这可能是因为相关的 explorer.exe 进程已经退出。Windows 对多个资源管理器窗口做了一些奇怪的事情,这取决于您设置的选项。默认情况下,如果我没记错的话,所有窗口最终都会在一个进程中运行。

我要做的是输出您刚刚生成的进程的 processid:

Console.WriteLine($"{process.Id} has exited {process.HasExited}");

然后看任务管理器,看看能不能找到对应的进程。我想 HasExited 是真的,所以你不会找到进程,但窗口会打开。

您可能必须设置process.EnableRaisingEventstrue从 获得有效答案process.HasExited,我不记得我的头顶。

还要通过文件夹选项检查资源管理器中的设置,以查看您是否已Launch Folder Windows in a separate process在视图选项卡上启用。

如果您确实找到了您的进程,您可以随时终止该进程并查看您的窗口是否关闭。如果是,则可能是 explorer.exe 没有创建主窗口句柄,您可以使用 Spy++ 检查该句柄


编辑了更多信息

此外,@Hans Passant 上面提到 shell 窗口的工作方式不同。所以实际发生的事情是,explorer.exe (1234)联系 root explorer.exe (321),然后创建一个新窗口(如果 Launch separator 为 false)或产生一个 subprocess explorer.exe (3445)您的进程explorer.exe (1234)已完成其工作,然后退出。您的进程不会创建任何窗口,因此CloseMainWindow()不会找到要关闭的窗口和错误。

如何关闭特定的资源管理器窗口

为此,您需要使用 ShellWindows,请参阅是否有办法使用 C# 关闭特定的资源管理器实例?

作为参考,那里使用的代码是:

ShellWindows _shellWindows = new SHDocVw.ShellWindows();
string processType;

foreach (InternetExplorer ie in _shellWindows)
{
    //this parses the name of the process
    processType = Path.GetFileNameWithoutExtension(ie.FullName).ToLower();

    //this could also be used for IE windows with processType of "iexplore"
    if (processType.Equals("explorer") && ie.LocationURL.Contains(@"C:/Users/Bob"))
        {
            ie.Quit();
        }    
}

请注意,您首先需要注意不要关闭用户想要打开的窗口。有没有理由关闭窗口?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

启动同一exe的多个实例

如何使用重新启动管理器在Inno Setup卸载中关闭然后重新启动explorer.exe?

Visual Studio Server Explorer 未关闭 sqlsrvr.exe 进程

关闭通过Explorer.exe打开的文件夹

Excel vba 使用相同的 explorer.exe 实例打开文件夹

无法在Windows XP中重新启动explorer.exe

使用Excel VBA重新启动explorer.exe

登录时Explorer.exe重新启动循环

WiX:如何立即重新启动explorer.exe?

在启动屏幕上冻结时,如何杀死explorer.exe?

从命令行关闭所有Internet Explorer实例?

如何在Excel VBA中关闭Internet Explorer实例

关闭所有Windows File Explorer窗口,但不要杀死explorer.exe shell

Explorer.exe开关

Explorer.exe和DWM.exe的Windows 7 CPU使用率过高

尝试创建一个脚本,该脚本在启动时结束explorer.exe,启动程序并在退出时关闭窗口

在进程启动时杀死explorer.exe,在进程结束时重新启动

Explorer.exe崩溃频繁

关闭打开的资源管理器窗口,而无需终止explorer.exe

如何关闭一个explorer.exe的窗口而不是结束整个过程

explorer.exe每五分钟启动一个新窗口(赢得10)

任务栏冻结,无法重新启动explorer.exe

重新启动explorer.exe时如何还原“丢失”的通知图标?

当指定文件的路径包含空格时,如何使用QProcess启动explorer.exe?

如何使用批处理文件重新启动explorer.exe

如何在不重新启动explorer.exe的情况下刷新桌面?

安装Windows Fall Creators Update(1709)之后,Explorer.exe将无法启动

如何使用批处理文件安全地重新启动explorer.exe

启动时禁用Windows 10的explorer.exe以运行自定义信息亭模式