2011-03-05 27 views
13

tengo un servicio de Windows que obtiene los detalles del usuario y guarda el resultado en el archivo de texto de registro. y, mi problema es que cuando apago o cierro sesión en mi sistema, también me gustaría guardar el tiempo que llevo en mi sistema en ese archivo de registro. pero, no sé cómo hacer eso.detectar apagado en servicio de ventana

Comprobé el método de winproc para detectar la operación de apagado, pero no pude usarlo en el servicio de ventana, en Google descubrí que solo se puede usar con formularios. ¿Cómo podemos detectar que el usuario ha hecho clic en cerrar o cerrar sesión y hacer alguna acción? entonces, por favor dame alguna idea o sugerencia sobre eso.

lo he utilizado para el cierre de sesión, pero en una entrada al registro cuando finalice la sesión del sistema

protected override void OnSessionChange(SessionChangeDescription changeDescription) 
    { 
    this.RequestAdditionalTime(250000); //gives a 25 second delay on Logoff 
    if (changeDescription.Reason == SessionChangeReason.SessionLogoff) 
    { 
     // Add your save code here 
     StreamWriter str = new StreamWriter("D:\\Log.txt", true); 
     str.WriteLine("Service stoped due to " + changeDescription.Reason.ToString() + "on" + DateTime.Now.ToString()); 
     str.Close(); 
    } 
    base.OnSessionChange(changeDescription); 
} 

Respuesta

13

Para una parada, reemplazar el método OnShutdown:

protected override void OnShutdown() 
{ 
    //your code here 
    base.OnShutdown(); 
} 

Para un cierre de sesión:

En primer lugar, agregar un controlador de eventos para Microsoft.Win32.SystemEvents.SessionEnded en el constructor de servicio:

public MyService() 
{ 
    InitializeComponent; 
    Microsoft.Win32.SystemEvents.SessionEnded += new Microsoft.Win32.SessionEndedEventHandler(SystemEvents_SessionEnded); 
} 

Luego agregar el controlador:

void SystemEvents_SessionEnded(object sender, Microsoft.Win32.SessionEndedEventArgs e) 
{ 
    //your code here 
} 

Esto debería capturar cualquier sesión finalizada, incluida la consola misma (la que ejecuta los servicios).

+0

el cierre de sesión no funciona, debería tener que agregar algo más – deepu

+0

@deepu: Lo siento, te he extraviado al olvidar la llamada a la base OnSessionChange. Ver mi última edición. – MPelletier

+0

gracias voy a comprobar que, ¿hay algún método para mantener apagado hasta que se complete el proceso OnShutdown evento – deepu

1

Tal vez se puede utilizar this. Haga una encuesta del método en cuestión de vez en cuando (intervalo de 1 segundo) y podrá hacer lo que quiera.

Necesita RegisterServiceCtrlHandlerEx Llamada API.

3

Debe anular OnShutdown en su servicio

// When system shuts down 
protected override void OnShutdown() 
{ 
    // Add your save code here 
    base.OnShutdown(); 
} 

Usted también puede anular OnStop

// When the user presses stops your service from the control panel 
protected override void OnStop() 
{ 
    // Add your save code here too 
    base.OnStop(); 
} 

Editar:
Si realmente desea escuchar el evento de cierre Microsoft.Win32.SystemEvents.SessionEnding es el camino a seguir.

+0

onshutdown funcionaba bien, pero cómo sostener Apagar hasta que mi proceso haya terminado ... ¿y puedo mantener el cierre hasta que mi proceso haya terminado? ¿Cómo es posible – deepu

+0

@deepu, se le da un tiempo razonable (creo que 30 segundos) para salvar su estado, si eso no es suficiente usted puede llamar a ['RequestAddtionalTime'] (http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.reques tadditionaltime.aspx). –

+0

gracias .. entonces puedo mantener apagado hasta que mi proceso haya terminado con RequestAddtionalTime. – deepu

6

Sé que estoy sacando esto de la muerte, pero lo encontré útil y espero agregar un poco al tema. Estoy implementando una biblioteca dúplex WCF alojada en un servicio de Windows y me encontré con este hilo porque necesitaba detectar, desde el servicio de Windows, cuando un usuario cierra la sesión o apaga la computadora. Estoy usando .Net Framework 4.6.1 en Windows 7 y Windows 10. Como se sugirió anteriormente para el apagado lo que funcionó para mí fue anulando ServiceBase.OnShutdown() así:

protected override void OnShutdown() 
{ 
    //Your code here 

    //Don't forget to call ServiceBase OnShutdown() 
    base.OnShutdown(); 
} 

Recuerde añadir lo siguiente al constructor de su servicio para permitir el evento de cierre que se detectará:

CanShutdown = true; 

Luego, para capturar cuando un usuario cierra la sesión, bloquea la pantalla, cambia de usuario, etc.puede simplemente reemplazar el método OnSessionChange así:

protected override void OnSessionChange(SessionChangeDescription changeDescription) 
{ 
    if (changeDescription.Reason == SessionChangeReason.SessionLogoff) 
    { 
     //Your code here... 

     //I called a static method in my WCF inbound interface class to do stuff... 
    } 

    //Don't forget to call ServiceBase OnSessionChange() 
    base.OnSessionChange(changeDescription); 
} 

Y, por supuesto, no olvide agregar lo siguiente al constructor de su servicio para permitir la captura de eventos de cambio de sesión:

CanHandleSessionChangeEvent = true; 
+0

Esta es la mejor respuesta en mi opinión. Tenía toda la información que necesitaba para mi servicio de Windows. – JakeStrang

+0

Ninguno de estos me llamaron. Establezca ambas propiedades, implemente ambas funciones, adjunte depurador. El código no se ejecuta. – jjxtra

Cuestiones relacionadas