我需要杀死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);
要更改注册表项,程序应以管理员身份运行:
exe
文件中嵌入一个清单文件,这将使Windows 7以管理员身份始终运行程序,正如本答复中的解释。 reg
命令。 6 。 设置后 – 重新启动浏览器 – 关闭:此代码可以关闭explorer
:
Process[] ps = Process.GetProcessesByName("explorer"); foreach (Process p in ps) p.Kill();