2012-06-28 16 views
6

Fare una semplice applicazione, quindi quando l'utente si disconnette da Windows, ovviamente chiude l'applicazione. Stiamo facendo una semplice applicazione USB Alert che ARRESTA lo spegnimento se viene rilevata una USB quando l'utente si disconnetteWM_QUERYENDSESSION mi sta causando problemi

Questo è il codice fino ad ora.

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

Quello che sta accadendo è che i programmi di forza di Windows per Quit viene visualizzata la schermata, ho letto da qualche parte se si torna da 0 a WM_QUERYENDSESSION non viene visualizzato questo, ma è ancora la visualizzazione di questa ...

Qualche idea?

EDIT:

Abbiamo usato il codice che qualcuno ha risposto con, ma ci sta ancora ricevendo questa schermata.

The screen we want to avoid!

+2

sta impedendo il sistema da arrestare una buona idea, in primo luogo? –

+1

Ma stiamo costruendo un programma, che se un utente ha lasciato un USB collegato, non possono spegnersi o disconnettersi finché non lo rimuovono. – x06265616e

risposta

3

Hai provato

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

Dovrebbe interrompere l'arresto.

+0

Non funziona per noi:/ – x06265616e

+0

Questo è documentato per funzionare, anche come altri hanno detto http://msdn.microsoft.com/en-us/library/aa376877%28VS.85%29.aspx il ShutdownBlockReasonCreate() dovrebbe anche lavorare. Il codice di ritorno di 0 apparentemente è morto con vista. – BugFinder

1

ho ottenuto questo lavorando bene ora con l'aggiunta di questo codice in

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

Ho cambiato anche il colpo di testa da WM_QUERYENDSESSION = 0x11; a WM_QUERYENDSESSION = 0x0011;

Non sono sicuro se questo è fatto nulla, ma il codice sembra funzionare, grazie a tutte le risposte

Problemi correlati