2010-04-03 19 views
5

tengo que matar el proceso ventanas de explorador (explorer.exe), para queProblema con Killing Windows Explorer?

Digamos que utilizo un método nativo TerminateProcess NT

Funciona, pero el problema es que el explorador se inicia de nuevo, puede ser ventanas es haciendo eso, de todos modos. Cuando mato explorer.exe con el administrador de tareas de Windows, no regresa, se mata.

Quiero hacer lo que taskmanager esté haciendo a través de mi aplicación.

Edit:
Gracias a @sblom lo resolví, una modificación rápida en el registro hizo el truco. Aunque es un truco ingenioso, al parecer taskmnager tiene una forma más limpia de hacerlo, dijo, he decidido seguir con el camino de @sblom por ahora.

Respuesta

8

La solución "real". (. Programa completo probado para funcionar en 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 y aceptado. Gracias hombre, muy apreciado! –

+0

Esta solución no funciona. Cierra el escritorio y la barra de tareas, pero no detiene el proceso explorer.exe. –

14

De Technet:

Puede establecer la clave de registro HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\AutoRestartShell a 0, y ya no de rearranque automático.

+0

@sblom Gran! Gracias, hombre, funciona, un pequeño misterio, aunque tu solución funciona a la perfección. taskmanager no parece interferir con la configuración de registro como esta. Ahora, por favor, por favor, no lo tomes como algo personal, solo me preguntaba. Su respuesta fue un salvavidas, ya que la necesitaba urgentemente –

+1

@sblom solo para darles a otras personas la oportunidad de resolver ese misterio de administrador de tareas. Dejo su impresora como no aceptada por un momento. ¡Lo haré eventualmente! –

2

Lo que probablemente deba hacer es, en lugar de utilizar TerminateProcess, publicar un mensaje WM_QUIT en las ventanas del explorador y en el hilo principal. Es un poco involucrado, pero he encontrado esta página que tiene un código de ejemplo que pueden ayudar a lo largo de:

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

Windows reiniciará automáticamente después de un explorer.exe TerminateProcess de manera que se reinicia en el caso de un accidente terminación.

4

Aquí hay otra solución a este problema - en lugar de llamadas a la API que utiliza una herramienta externa se envía con ventanas (al menos 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); 
       } 
      } 
     } 
    } 

Sé que Win32Exception puede no ser la mejor excepción, pero este método actúa más o menos como Kill, con la excepción de que realmente mata a Windows Explorer.

he añadido como un método de extensión, para que pueda usarlo directamente en objetos de proceso:

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

debe asegurarse primero de que la herramienta taskkill está disponible en el entorno de producción (parece que ha sido por un tiempo con Windows: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/taskkill.mspx?mfr=true).

0

que tienen algunas investigaciones y estos son: reslts

Windows reiniciará explorer después de su cierre - excepto por el Administrador de tareas -.

por lo que debe cambiar el relacionado 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); 

Para cambiar una clave de registro debe ejecutar el programa como administrador:

  • Puede mostrar mensaje de UAC de usuario para ejecutar la aplicación como administrador como explicando en este Answer. Y si UAC está apagado, te dirijo a este Answer.
  • Puede incrustar un archivo de manifiesto en el exe, que hará que Windows Seven ejecute siempre el programa como administrador, como se explica en este Answer.
  • Debe saber que no puede obligar a que su proceso comience como administrador; para que pueda ejecutar su proceso dentro de su proceso como otro proceso! Puede usar este blog post o este answer.
  • También puede usar el comando reg con esta [Documentación de Microsoft Windows]. 6.

Después de establecer que - reiniciar el explorador - off: Este código se puede cerrar explorer:

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

Agrego mi respuesta solo como resultado de lo que hice por el mismo problema;). –

Cuestiones relacionadas