Tal como se publicó en esta respuesta de StackOverflow: https://stackoverflow.com/a/604042/700926, debería echar un vistazo al SystemEvents.SessionSwitch Event.
El código de muestra se puede encontrar en la respuesta remitida también.
Acabo de tomar el código que se muestra en el referido StackOverflow answer para un giro y parece funcionar en Windows 8 RTM con .NET framework 4.5.
Para su referencia, he incluido el código de muestra completo de la aplicación de consola que acabo de ensamblar.
using System;
using Microsoft.Win32;
// Based on: https://stackoverflow.com/a/604042/700926
namespace WinLockMonitor
{
class Program
{
static void Main(string[] args)
{
Microsoft.Win32.SystemEvents.SessionSwitch += new Microsoft.Win32.SessionSwitchEventHandler(SystemEvents_SessionSwitch);
Console.ReadLine();
}
static void SystemEvents_SessionSwitch(object sender, Microsoft.Win32.SessionSwitchEventArgs e)
{
if (e.Reason == SessionSwitchReason.SessionLock)
{
//I left my desk
Console.WriteLine("I left my desk");
}
else if (e.Reason == SessionSwitchReason.SessionUnlock)
{
//I returned to my desk
Console.WriteLine("I returned to my desk");
}
}
}
}
Posible duplicado de: http://stackoverflow.com/questions/603484/checking-for-workstation-lock-unlock-change-with-c-sharp o esta http://stackoverflow.com/questions/44980/how-can-i-programmatically-determine-if-my-workstation-is-locked –
Las respuestas en ese enlace no estaban a la altura de la marca. :( –
Agregué un enlace más - parece que hay muchas "instancias" de este tipo de preguntas en StackOverflow. Sin embargo, publiqué una de ellas como respuesta, ya que incluía código de ejemplo que podría serle útil. –