2010-04-03 2 views
5

Ich brauche Windows Explorer den Prozess (explorer.exe) zu töten, denn dasProblem mit Windows-Explorer zu töten?

i eine native Methode NT TerminateProcess verwenden können sagen

Es funktioniert, aber das Problem ist, dass der Explorer wieder beginnt, Fenster sein kann, ist tut das sowieso. Wenn ich explorer.exe mit dem Windows Task-Manager abbringe, kommt es nicht zurück, es bleibt stehen.

Ich möchte tun, was Taskmanager durch meine Anwendung tut.

Bearbeiten:
Dank @sblom habe ich es gelöst, eine schnelle Änderung in der Registrierung hat den Trick. Obwohl es ein cleverer Hack ist, anscheinend ein Taskmanger, der das auf eine sauberere Art und Weise macht, sagte ich, ich habe mich entschieden, @ sblom vorerst zu gehen.

Antwort

8

Die "echte" Lösung. (. Das Gesamtprogramm Getestet unter Windows arbeiten 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; 
     } 
    } 
} 
+0

@sblom +1 und akzeptiert. Danke Mann, sehr geschätzt! –

+0

Diese Lösung funktioniert nicht. Es schließt den Desktop und die Taskleiste, stoppt den explorer.exe-Prozess jedoch nicht tatsächlich. –

14

Von Technet:

Sie den Registrierungsschlüssel HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoRestartShell auf 0 gesetzt, und es wird nicht mehr Auto-Neustart.

+0

@sblom Großen: Dieser Code kann explorer schließen! danke Mann, es funktioniert, ein kleines Geheimnis, obwohl Ihre Workaround funktioniert perfekt. taskmanager scheint nicht mit Registry-Einstellungen wie folgt zu tun. Bitte nehmen Sie es bitte nicht persönlich, ich habe mich nur gefragt. Deine Antwort war ein Lebensretter, da ich sie dringend brauchte –

+1

@sblom Nur um anderen Leuten eine Chance zu geben, dieses Taskmanager-Rätsel zu lösen, lasse ich deine Anwers für eine Weile als un-akzeptiert zurück. Ich werde das irgendwann tun! –

2

Was Sie wahrscheinlich tun müssen, ist anstatt TerminateProcess zu verwenden, eine WM_QUIT-Nachricht an die Explorer-Fenster und den Hauptthread zu senden. Es ist ein bisschen beteiligt, aber ich fand diese Seite, die einige Beispiel-Code, die Sie zusammen helfen könnten:

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

Windows wird automatisch explorer.exe nach einem TerminateProcess neu starten, so dass es im Falle eines Absturzes startet Beendigung.

4

Hier ist eine andere Lösung für dieses Problem - stattdessen API-Aufrufe verwendet es ein externes Tool mit Windows ausgeliefert (mindestens 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); 
       } 
      } 
     } 
    } 

Ich weiß, dass Win32Exception möglicherweise nicht die beste Ausnahme ist, aber diese Methode funktioniert mehr oder weniger wie Kill - mit der Ausnahme, dass es Windows Explorer tatsächlich tötet.

Ich habe es als eine Erweiterung Methode hinzugefügt, so können Sie diese Aufgabe direkt auf Prozess verwenden:

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

Sie müssen zunächst sicherstellen, dass die taskkill-Tool auf der Produktionsumgebung verfügbar ist (es scheint, dass es gewesen ist für eine Weile mit Windows: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/taskkill.mspx?mfr=true).

0

Ich habe einige Forschungen und diese sind reslts:

Windows wird explorer neu starten, nachdem es geschlossen - außer durch den Task-Manager -.

So sollten Sie die damit verbundene RegistryKey ändern:

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); 

Für einen Registrierungsschlüssel zu ändern das Programm als Administrator ausführen sollte:

  • Sie UAC Aufforderung zum Benutzer zeigen kann, laufen die Anwendung als Administrator wie in diesem Answer erläutert. Und wenn UAC ausgeschaltet ist, richte ich Sie auf diese Answer.
  • Sie können eine Manifest-Datei in die exe einbetten, was dazu führt, dass Windows Seven das Programm immer als Administrator ausführt, wie in diesem Artikel beschrieben Answer.
  • Sie sollten wissen, dass Sie Ihren Prozess nicht als Administrator erzwingen können; So können Sie Ihren Prozess in Ihrem Prozess als einen anderen Prozess ausführen! Sie können diese blog post oder diese answer verwenden.
  • Sie können auch den Befehl reg mit dieser [Microsoft Windows-Dokumentation] verwenden. 6.

Danach Einstellung - Neustarten Explorer - off:

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

Ich füge meine Antwort nur als Ergebnis dessen, was ich für das gleiche Problem gemacht habe;). –