【问题标题】:How do I stop then start explorer.exe in C#?如何在 C# 中停止然后启动 explorer.exe?
【发布时间】:2012-07-09 22:45:34
【问题描述】:

所以我的电脑有很多错误。 99% 的时间,它们是由 explorer.exe 愚蠢造成的。我可以手动停止它们,但我想我可以设置一个每隔 10 分钟左右自动停止和启动的时间表,所以我再也不会遇到任何问题了。我的代码不起作用,但我还是把它:

foreach (System.Diagnostics.Process myProc in System.Diagnostics.Process.GetProcesses())
        {
            if (myProc.ProcessName == "explorer.exe")
            {
                myProc.Kill();
            }
        }

当我运行它时,绝对没有任何反应。 Visual Studio 不会出错,程序不会崩溃,等等。它什么也不做。

【问题讨论】:

  • 确保您以管理员身份运行它,并使用GetProcessesByName 而不是您当前的检查。此外,我建议不要这样做。
  • 最好花时间解决问题,而不是一直重启 explorer.exe...
  • 这是一种核心的 Windows 进程——看起来你可能在做一些愚蠢的事情,或者更有可能(而且我更友善)你感染了病毒。
  • 你真的应该学习如何使用任何程序员用来完成工作的基本工具。首先是调试器,所以你会看到 Kill() 永远不会被调用。接下来是 Sysinternal 的 AutoRuns 实用程序,因此您可以禁用破坏资源管理器稳定的 shell 扩展。

标签: c# process explorer


【解决方案1】:

请避免使用the for-if anti-pattern:

var explorers = Process.GetProcessesByName("explorer");
foreach (var thisExplorer in explorers)
{
    thisExplorer.Kill();
}

编辑:如 cmets 中的charmander 所述。

【讨论】:

    【解决方案2】:

    在假设您知道它包含什么之前,查看特定方法/属性的输出通常是个好主意。

    在这种情况下,myProc.ProcessName 不包含进程的扩展。所以比较一下“explorer”。

    此外,在对集合进行 foreaching 的同时修改集合通常会导致运行时错误。

    【讨论】:

    • 我不相信 OP 实际上正在修改集合,确定它们正在影响其中的对象,但集合本身并没有被修改。
    • @StefanH:我还没有进行研究——我不知道该收藏是如何维护的。如果它只是当前进程列表的快照,那么您是正确的。如果有某种 black-majik-voodoo-hoodoo 使列表与当前进程列表保持同步,那么 foreacher 将有祸了。
    【解决方案3】:

    进程名只是“explorer”

    编辑: 这对我的盒子起到了作用:

    foreach (System.Diagnostics.Process myProc in System.Diagnostics.Process.GetProcesses())
            {
                if (myProc.ProcessName == "explorer")
                {
                    myProc.Kill();
                }
            }
    

    【讨论】:

    • 当我只使用资源管理器时,它在结束后立即重新启动。听起来不错,但它在运行后立即给我这个错误,这可能会很烦人:i.imgur.com/QaKGZ.jpg%22
    • 相等检查更安全。我可以很容易地想象一个进程,它的名称中恰好包含“explorer”这个词,这将在这里被不必要地杀死。
    • @dlev 我并不是建议他使用 .contains,我只是表明它抓取了正确的应用程序。
    • @StefanH 即便如此,当你说“这对我有用”后跟一个代码 sn-p 时,你就是在认可这个 sn-p(除非你另有说明。)
    • @dlev 将其更新为相等。我部分发布了如果 Windows 7 以外的系统以不同的方式执行此操作,OP 可能已经调试并查看代码停止的进程名称是什么,然后将其更新为使用相等性。而不是 OP 完全尝试我所拥有的,然后它具有与以前相同的行为。
    【解决方案4】:

    你也可以用 Linq 的方式来做

    List<Process> processes = Process.GetProcesses().Where(p => p.ProcessName == "explorer").ToList();
    
    foreach (var process in processes)
    {
      process.Kill();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-14
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多