Para recibir una notificación cuando ningún usuario inicia sesión en la máquina, llame al WTSRegisterSessionNotification
, pasando NOTIFY_FOR_ALL_SESSIONS
, y escuche el mensaje WM_WTSSESSION_CHANGE
en el bucle del mensaje.
En el mensaje, que tire la wParam
a la Microsoft.Win32.SessionSwitchReason
enumeración de averiguar lo que pasó, y pasar el lParam
a WTSQuerySessionInformation
para encontrar el nombre de usuario.
[DllImport("Wtsapi32.dll", CharSet=.CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool WTSRegisterSessionNotification(IntPtr hWnd, int dwFlags);
//Pass this value in dwFlags
public const int NOTIFY_FOR_ALL_SESSIONS = 0x1;
//Listen for this message
public const int WM_WTSSESSION_CHANGE = 0x02B1;
//Call this method before exiting your program
[DllImport("Wtsapi32.dll", CharSet=.CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool WTSUnRegisterSessionNotification(IntPtr hWnd);
SystemEvents.SessionSwitch solo se activará para el usuario actual, que no parece ser lo que quiere. (Consulte la fuente de referencia de .Net para SystemEvents.EnsureRegisteredSessionNotification) – SLaks
Tenga en cuenta que para usar SystemEvents desde un servicio necesita un bucle de mensaje. La forma más sencilla de hacerlo es crear una forma oculta. Vea el ejemplo 2 en http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.aspx para obtener un excelente ejemplo de esto. – Rory