重复问题:如何在程序中确定我的工作站是否被锁定?
我该如何在运行时检测Windows用户何时锁定(Windows+L)并再次解锁屏幕。我知道可以全局跟踪键盘输入,但是能否通过环境变量检查这种情况呢?
重复问题:如何在程序中确定我的工作站是否被锁定?
我该如何在运行时检测Windows用户何时锁定(Windows+L)并再次解锁屏幕。我知道可以全局跟踪键盘输入,但是能否通过环境变量检查这种情况呢?
一个SessionSwitch事件可能是您最好的选择。检查通过SessionSwitchEventArgs传递的SessionSwitchReason以了解它是什么类型的切换,并做出适当的反应。
您可以通过WM_WTSSESSION_CHANGE消息获得此通知。您必须通过WTSRegisterSessionNotification通知Windows您希望接收这些消息,并使用WTSUnRegisterSessionNotification取消注册。
对于C#实现,这些文章应该有所帮助。
http://pinvoke.net/default.aspx/wtsapi32.WTSRegisterSessionNotification
http://blogs.msdn.com/shawnfa/archive/2005/05/17/418891.aspx
http://bytes.com/groups/net-c/276963-trapping-when-workstation-locked
您可以使用ComponentDispatcher
作为获取这些事件的另一种方式。
以下是一个示例类来包装它。
public class Win32Session
{
private const int NOTIFY_FOR_THIS_SESSION = 0;
private const int WM_WTSSESSION_CHANGE = 0x2b1;
private const int WTS_SESSION_LOCK = 0x7;
private const int WTS_SESSION_UNLOCK = 0x8;
public event EventHandler MachineLocked;
public event EventHandler MachineUnlocked;
public Win32Session()
{
ComponentDispatcher.ThreadFilterMessage += ComponentDispatcher_ThreadFilterMessage;
}
void ComponentDispatcher_ThreadFilterMessage(ref MSG msg, ref bool handled)
{
if (msg.message == WM_WTSSESSION_CHANGE)
{
int value = msg.wParam.ToInt32();
if (value == WTS_SESSION_LOCK)
{
OnMachineLocked(EventArgs.Empty);
}
else if (value == WTS_SESSION_UNLOCK)
{
OnMachineUnlocked(EventArgs.Empty);
}
}
}
protected virtual void OnMachineLocked(EventArgs e)
{
EventHandler temp = MachineLocked;
if (temp != null)
{
temp(this, e);
}
}
protected virtual void OnMachineUnlocked(EventArgs e)
{
EventHandler temp = MachineUnlocked;
if (temp != null)
{
temp(this, e);
}
}
}
你绝对不需要使用WM_WTSSESSION_CHANGE,只需使用内部WTTS API即可。