2009-10-06 13 views
5
using Microsoft.Win32; 

public class App 
{ 
    static void Main() 
    { 
    SystemEvents.SessionSwitch += SystemEvents_SessionSwitch; 
    Console.ReadLine(); 
    SystemEvents.SessionSwitch -= SystemEvents_SessionSwitch; 
    } 

    static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e) 
    { 
    if(e.Reason == SessionSwitchReason.SessionLock) 
    { 
    Console.WriteLine("locked at {0}", DateTime.Now); 
    } 
    if(e.Reason == SessionSwitchReason.SessionUnlock) 
    { 
    Console.WriteLine("unlocked at {0}", DateTime.Now); 
    } 
} 

He creado un servicio de Windows. Cuando reinicio el sistema e inicio de sesión, cierre la sesión, bloquee o desbloquee la sesión. no capturará el evento. El servicio se está ejecutando, pero no funcionará correctamente.¿Cómo capturar de manera confiable los inicios de sesión de Windows, cerrar sesión, bloquear y desbloquear eventos de un servicio?

Cuando reinicio el servicio, capturará todos los eventos como se esperaba. ¿Cómo hago para solucionar problemas/corregir esto?

+0

Y qué intenta decirnos con eso ... Especifique "no va a funcionar" un poco más detallado ... ¿cómo no funciona? ¿Qué hace? ¿Qué debería hacer? –

+0

¿A qué versión (s) de Windows está tratando específicamente de apuntar? Los eventos se comportaron de manera diferente entre 2000, XP y Vista –

Respuesta

6

Haga que su servicio dependa de TermService (el servicio de Servicios de Terminal). Debajo de las cubiertas, la clase SystemEvents se basa en la función Win32 de WTSRegisterSessionNotification, que is documented falla si el servicio de Terminal Services no ha comenzado cuando se lo llama. Al agregar la dependencia de TermService a su servicio, eso no sucederá. También puede conectarse al evento global Global \ TermSrvReadyEvent usando una técnica como this y esperar para registrar el controlador SystemEvent hasta que se desate el evento TS "listo".

0

intente dejar el evento registrado en lugar de eliminarlo después de la línea de lectura Se está registrando para escuchar y luego cancelar el registro lo que no tiene sentido.

Cuestiones relacionadas