2010-04-03 19 views
5

Ho bisogno di uccidere processo di finestre di Explorer (explorer.exe), per quellaProblema con Killing Windows Explorer?

consente di dire io uso un nativo NT metodo TerminateProcess

funziona, ma il problema è che l'esploratore ricomincia, può essere Windows è farlo comunque. Quando uccido explorer.exe con Windows Task Manager, non torna indietro, rimane bloccato.

Voglio fare tutto ciò che taskmanager sta facendo attraverso la mia applicazione.

Modifica:
Grazie a @sblom ho risolto, un rapido tweak nel Registro di sistema ha fatto il trucco. Anche se è un trucco intelligente, apparentemente taskmnager ha un modo più pulito di farlo, ho detto, per ora ho deciso di seguire il percorso di @ sblom.

risposta

8

La soluzione "reale". (. Il programma completo testato per funzionare su 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; 
     } 
    } 
} 
+0

@sblom +1 e accettato. Grazie amico, molto apprezzato! –

+0

Questa soluzione non funziona. Chiude il desktop e la barra delle applicazioni, ma in realtà non interrompe il processo explorer.exe. –

14

Da Technet:

È possibile impostare la chiave di registro HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoRestartShell a 0, e non sarà più il riavvio automatico.

+0

@sblom Grande! grazie amico funziona, un piccolo mistero anche se la tua soluzione funziona perfettamente. taskmanager non sembra rovinare le impostazioni del registro come questo. Ora per favore, per favore, non prenderlo personalmente mi stavo chiedendo. La tua risposta è stata una salvezza vitale, poiché avevo urgentemente bisogno del –

+1

@sblom solo per dare ad altre persone la possibilità di risolvere il mistero del taskmanager che lasciavo la tua ansiosa come non accettata per un po '. Lo farò alla fine! –

2

Quello che probabilmente devi fare è invece di usare TerminateProcess, postare un messaggio WM_QUIT su windows e thread principale di explorer. E 'un po' coinvolto, ma ho trovato questo sito che ha qualche esempio di codice che potrebbe aiutarvi a lungo:

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

di Windows si riavvia automaticamente dopo un explorer.exe TerminateProcess in modo che si riavvia nel caso di un crash terminazione.

4

Ecco un'altra soluzione a questo problema - invece chiamate API che utilizza uno strumento esterno fornito con Windows (almeno 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); 
       } 
      } 
     } 
    } 

So che Win32Exception potrebbe non essere la migliore eccezione, ma questo metodo agisce più o meno come Kill - con l'eccezione che uccide Windows Explorer.

Ho aggiunto come un metodo di estensione, quindi è possibile utilizzarlo direttamente su un oggetto processo:

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

è necessario innanzitutto assicurarsi che lo strumento taskkill è accessibile ambiente di produzione (sembra che è stato per un po 'con windows: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/taskkill.mspx?mfr=true).

0

devo alcune ricerche e questi sono reslts:

Windows riavviare explorer dopo la sua chiusura - tranne che da Task Manager -.

così si dovrebbe cambiare il relativo 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); 

Per modificare una chiave di registro il programma deve essere eseguito come amministratore:

  • È possibile mostrare UAC per l'utente per eseguire l'applicazione come amministratore come spiegato in questo Answer. E se il controllo dell'account utente è disattivato, indirigo a questo numero Answer.
  • È possibile incorporare un file manifest nello exe, che farà sì che Windows Seven esegua sempre il programma come amministratore, come spiegato in questo Answer.
  • È necessario sapere che non è possibile forzare l'avvio del processo come amministratore; in modo da poter eseguire il processo all'interno del processo come un altro processo! È possibile utilizzare questo blog post o questo answer.
  • È inoltre possibile utilizzare il comando reg con questa [documentazione di Microsoft Windows]. 6.

Dopo l'impostazione che - riavvio Explorer - off: Questo codice può chiudere explorer:

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

aggiungo la mia risposta proprio come risultato di ciò che ho fatto per lo stesso problema;). –

Problemi correlati