问题与杀死Windows资源pipe理器?

我需要杀死Windows资源pipe理器的进程(explorer.exe),为此

可以说我使用本地NT方法TerminateProcess

它的工作,但问题是,资源pipe理器重新启动,可能是Windows正在做那个,反正。 当我杀死explorer.exe与Windows任务pipe理器,它不会回来,其停留死亡。

我想通过我的应用程序做任何事情pipe理者。

编辑:
感谢@sblom我解决了它,在registry中快速调整了伎俩。 虽然这是一个聪明的黑客攻击,显然,任务pipe理员有一个更干净的方式,那就是说,我决定现在就用@ sblom的方式。

“真正”的解决方案。 (完整的程序,经过测试可以在Windows 7上运行)

using System; using System.Runtime.InteropServices; namespace ExplorerZap { class Program { [DllImport("user32.dll")] public static extern int FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll")] public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam); [return: MarshalAs(UnmanagedType.Bool)] [DllImport("user32.dll", SetLastError = true)] public static extern bool PostMessage(int hWnd, uint Msg, int wParam, int lParam); static void Main(string[] args) { int hwnd; hwnd = FindWindow("Progman", null); PostMessage(hwnd, /*WM_QUIT*/ 0x12, 0, 0); return; } } } 

来自Technet :

您可以将注册表项HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoRestartShell为0,它将不再自动重新启动。

这是另一个解决这个问题的方法 – 而不是API调用它使用Windows附带的外部工具(至少Win 7 Professional):

  public static class Extensions { public static void ForceKill(this Process process) { using (Process killer = new Process()) { killer.StartInfo.FileName = "taskkill"; killer.StartInfo.Arguments = string.Format("/f /PID {0}", process.Id); killer.StartInfo.CreateNoWindow = true; killer.StartInfo.UseShellExecute = false; killer.Start(); killer.WaitForExit(); if (killer.ExitCode != 0) { throw new Win32Exception(killer.ExitCode); } } } } 

我知道Win32Exception可能不是最好的异常,但这种方法或多或少像杀死 – 除了它实际上杀死Windows资源管理器。

我已经将它作为扩展方法添加,因此您可以直接在Process对象上使用它:

  foreach (Process process in Process.GetProcessesByName("explorer")) { process.ForceKill(); } 

您必须首先确保taskkill工具在生产环境中可用(看起来已经有一段时间了,在Windows中: http : //www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us /taskkill.mspx?mfr=true )。

你可能需要做的是不使用TerminateProcess,WM_QUIT消息发送到资源管理器窗口和主线程。 这有点牵扯,但是我发现这个页面有一些示例代码可以帮助你:

http://www.replicator.org/node/100

Windows会在TerminateProcess后自动重新启动explorer.exe,以便在崩溃终止的情况下重新启动。

我有一些研究,这些是reslts:

关闭后,Windows将重新启动explorer 管理器除了任务管理器 – 。

所以你应该改变相关的RegistryKey

 RegistryKey regKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Default).OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion\Winlogon", RegistryKeyPermissionCheck.ReadWriteSubTree); if (regKey.GetValue("AutoRestartShell").ToString() == "1") regKey.SetValue("AutoRestartShell", 0, RegistryValueKind.DWord); 

要更改注册表项,程序应以管理员身份运行:

  • 您可以显示UAC提示给用户以管理员身份运行应用程序以解释此答案 。 如果UAC被关闭,我会直接给你答复 。
  • 您可以在exe文件中嵌入一个清单文件,这将使Windows 7以管理员身份始终运行程序,正如本答复中的解释。
  • 你应该知道你不能强制你的程序以管理员身份启动; 所以你可以在你的进程内运行你的进程作为另一个进程! 你可以使用这个博客文章或这个答案 。
  • 您也可以在此[Microsoft Windows文档]中使用reg命令。 6 。

设置后 – 重新启动浏览器 – 关闭:此代码可以关闭explorer

 Process[] ps = Process.GetProcessesByName("explorer"); foreach (Process p in ps) p.Kill();