2012-06-28 21 views
6

Realizando una aplicación simple, por lo que cuando el usuario cierra sesión en Windows, por supuesto, cierra la aplicación. Estamos haciendo una aplicación de alerta USB simple que DETIENE el apagado si se detecta un USB cuando el usuario cierra la sesiónWM_QUERYENDSESSION me está causando problemas

Este es el código hasta el momento.

public Form1() 
    { 
     InitializeComponent(); 
    } 

    private static int WM_QUERYENDSESSION = 0x11; 
    private static bool systemShutdown = false; 
    protected override void WndProc(ref System.Windows.Forms.Message m) 
    { 
     if (m.Msg == WM_QUERYENDSESSION) 
     { 
      //MessageBox.Show("queryendsession: this is a logoff, shutdown, or reboot"); 
      systemShutdown = true; 
      m.Result = (IntPtr)0; 
     } 

     // If this is WM_QUERYENDSESSION, the closing event should be 
     // raised in the base WndProc. 
     m.Result = (IntPtr)0; 
     base.WndProc(ref m); 

    } //WndProc 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if (systemShutdown) 
     { 
      systemShutdown = false; 
      bool hasUSB = false; 

      foreach (DriveInfo Drive in DriveInfo.GetDrives()) 
      { 
       if (Drive.DriveType == DriveType.Removable) 
       { 
        hasUSB = true; 
       } 
      } 

      if (hasUSB) 
      { 
       e.Cancel = true; 
       MessageBox.Show("You still have USB device plugged in, please unplug it and log off again"); 
      } 
      else 
      { 
       e.Cancel = false; 
      } 
     } 
    } 

Lo que ocurre es que los programas de Windows para la Fuerza Quit se está visualizando la pantalla, leí en alguna parte si vuelve a 0 WM_QUERYENDSESSION que no muestra esto, pero todavía se visualiza esto ...

¿Alguna idea?

EDIT:

se utilizó el código que alguien respondió con, pero todavía están recibiendo esta pantalla.

The screen we want to avoid!

+2

está impidiendo que el sistema se apague una buena idea en primer lugar? –

+1

Pero estamos creando un programa, que si un usuario ha dejado un USB conectado, no pueden apagarlo o cerrar sesión hasta que lo eliminen. – x06265616e

Respuesta

3

Ha intentado

[DllImport("advapi32.dll", SetLastError=true)] 
static extern bool AbortSystemShutdown(string lpMachineName); 

En caso de anular el apagado.

+0

No funciona para nosotros:/ – x06265616e

+0

Está documentado que funciona, también como otros han dicho http://msdn.microsoft.com/en-us/library/aa376877%28VS.85%29.aspx el ShutdownBlockReasonCreate() debería Además trabajo. El código de retorno de 0 aparentemente murió con vista. – BugFinder

1

Tengo esta trabajando bien ahora añadiendo este código en

 [DllImport("user32.dll", SetLastError = true)] 
    static extern int CancelShutdown(); 

También ha cambiado la cabecera de WM_QUERYENDSESSION = 0x11; a WM_QUERYENDSESSION = 0x0011;

No estoy seguro si esto se ha hecho nada, pero el código parece funcionar, gracias a todas las respuestas

Cuestiones relacionadas