DUPLICATE: 如何以编程方式确定我的工作站是否被locking?
如何检测(在运行时)Windows用户何时locking其屏幕(Windows + L)并再次解锁。 我知道我可以在全球范围内跟踪键盘input,但是可以用环境variables来检查这样的事情吗?
你可以通过WM_WTSSESSION_CHANGE消息得到这个通知。 您必须通知Windows您想通过WTSRegisterSessionNotification接收这些消息,并使用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
SessionSwitch事件可能是你最好的选择。 检查通过SessionSwitchEventArgs传递的SessionSwitchReason来找出它是什么样的开关,并作出适当的反应。
您可以使用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 apis。