2009-06-12 14 views

risposta

9

C'è una proprietà in Ambiente classe che racconta se processo di arresto è stato avviato:

Environment.HasShutDownStarted 

Ma dopo un po 'googling ho scoperto che questo può essere di aiuto a voi:

using Microsoft.Win32; 

//during init of your application bind to this event 
SystemEvents.SessionEnding += 
      new SessionEndingEventHandler(SystemEvents_SessionEnding); 

void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e) 
{ 
    if (Environment.HasShutdownStarted) 
    { 
     //Tackle Shutdown 
    } 
    else 
    { 
     //Tackle log off 
    } 
    } 

Ma se si desidera solo cancellare il file temporaneo, penso che distinguere tra arresto o disconnessione non sia di alcuna conseguenza per voi.

+0

Occorre tuttavia tenere presente, su Vista + avete pochissimo tempo per fare cose durante l'arresto, quindi assicurati di non poter bloccare o attendere alcun motivo (ad es. tentare di cancellare un file che potrebbe essere in una condivisione di rete, ecc ...) –

+0

grazie a @Paul quindi dovrebbe essere consigliabile fare un'immissione da qualche parte in modo che Windows cancella le cose al prossimo riavvio o login? – TheVillageIdiot

0

È possibile utilizzare WMI e guardare Win32_ComputerShutdownEvent dove Type è uguale a 0. È possibile trovare ulteriori informazioni su questo evento here e altro sull'utilizzo di WMI in .NET here.

6

Se è specificamente necessario l'evento di log-off, è possibile modificare il codice fornito nella risposta di TheVillageIdiot come segue:

using Microsoft.Win32; 

//during init of your application bind to this event 
SystemEvents.SessionEnding += 
    new SessionEndingEventHandler(SystemEvents_SessionEnding); 

void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e) 
{  
    if (e.Reason == SessionEndReasons.Logoff) 
    { 
     // insert your code here 
    } 
} 
Problemi correlati