2012-06-28 11 views
6

Tworzenie prostej aplikacji, więc gdy użytkownik wyloguje się z systemu Windows, to oczywiście zamyka aplikację. Tworzymy prostą aplikację USB Alert, która wyłącza się STOPS, jeśli wykryto USB, gdy użytkownik wylogowuje się.WM_QUERYENDSESSION sprawia mi problemy

To jest kod do tej pory.

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

Co się dzieje jest to, że programy siły Okna do Quit jest wyświetlany ekran, czytałem gdzieś, jeśli wrócisz 0 do WM_QUERYENDSESSION nie wyświetlać tego, ale wciąż jest to wyświetlanie ...

Jakieś pomysły?

EDIT:

Użyliśmy kod, który ktoś odpowiedział, ale wciąż otrzymuję ten ekran.

The screen we want to avoid!

+2

powstrzymuje system przed zamknięciem dobry pomysł na pierwszym miejscu? –

+1

Ale budujemy program, że jeśli użytkownik zostawił podłączony przez USB, nie może zamknąć się ani wylogować, dopóki go nie usunie. – x06265616e

Odpowiedz

3

Czy próbowałeś

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

powinien przerwać wyłączył.

+0

Nie działa dla nas:/ – x06265616e

+0

To jest udokumentowane do działania, również jak powiedzieli inni http://msdn.microsoft.com/en-us/library/aa376877%28VS.85%29.aspx ShutdownBlockReasonCreate() powinno również działa. Kod powrotu 0 najwyraźniej zmarł z widokiem. – BugFinder

1

mam to działa teraz dobrze dodając ten kod w

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

ja również zmienić nagłówek z WM_QUERYENDSESSION = 0x11; do WM_QUERYENDSESSION = 0x0011;

Nie wiem, czy to zrobiła nic, ale kod wydaje się działać, dzięki wszystkich odpowiedzi

Powiązane problemy