![为什么当我使用 Process.Kill 终止 explorer 时它会自动重新启动?](https://linux22.com/image/1340312/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BD%93%E6%88%91%E4%BD%BF%E7%94%A8%20Process.Kill%20%E7%BB%88%E6%AD%A2%20explorer%20%E6%97%B6%E5%AE%83%E4%BC%9A%E8%87%AA%E5%8A%A8%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8%EF%BC%9F.png)
如果我像这样终止 explorer.exe:
private static void KillExplorer()
{
var processes = Process.GetProcessesByName("explorer");
Console.Write("Killing Explorer... ");
foreach (var process in processes)
{
process.Kill();
process.WaitForExit();
}
Console.WriteLine("Done");
}
它会立即重新启动。
但是如果我使用taskkill /F /IM explorer.exe
,或者从任务管理器中将其终止,它就不会重新启动。
这是为什么?有什么区别?如何才能在不重新启动 explorer.exe 的情况下从代码中关闭它?当然,我可以从代码中调用 taskkill,但我希望有一个更干净的解决方案……
答案1
我不能说我没有作弊来得到答案。所有荣誉都归功于 Morguth 的帖子这里。
他建议(并已证明在我的 Win7 和 XPMode 上有效)有一个注册表项可以强制 shell 自动重新启动。使用以下代码可以禁用该功能。
RegistryKey ourKey = Registry.LocalMachine;
ourKey = ourKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", true);
ourKey.SetValue("AutoRestartShell", 0);
// Kill the explorer by the way you've post and do your other work
ourKey.SetValue("AutoRestartShell", 1)
答案2
不要使用 Process.Kill,尝试以下方法:
Process.Start(@"C:\Windows\System32\taskkill.exe", @"/F /IM explorer.exe");