winform监听用户注销和关机
监听Windows 系统会话事件
winform监听用户锁屏监听电脑锁屏
winform监听用户解锁电脑
用户按了 Win+L,即将锁屏
监听“会话切换”事件(锁屏/解锁等)
private void OnSessionSwitch(object sender, SessionSwitchEventArgs e)
{
switch (e.Reason)
{
case SessionSwitchReason.SessionLock:
// 用户按了 Win+L,即将锁屏
Console.WriteLine("系统即将锁屏");
break;
case SessionSwitchReason.SessionUnlock:
// 用户解锁了电脑
Console.WriteLine("系 统已解锁");
break;
case SessionSwitchReason.ConsoleDisconnect:
case SessionSwitchReason.RemoteDisconnect:
// 远程桌面断开
break;
}
}
用户正在注销
private void OnSessionEnding(object sender, SessionEndingEventArgs e)
{
// 用户正在注销(e.Reason == SessionEndReasons.Logoff)
// 或关机(e.Reason == SessionEndReasons.SystemShutdown)
MessageBox.Show($"系统即将{(e.Reason == SessionEndReasons.Logoff ? "注销" : "关机")}");
// 注意:你只有几秒钟时间处理,不能阻止(除非是服务且有权限)
}
感知用户登录状态、锁屏/解锁、关机等场景的桌面应用程序中
作用:
当 Windows 即将结束当前用户会话 时触发,包括两种情况:
- 用户点击“注销” →
e.Reason == SessionEndReasons.Logoff - 用户点击“关机”或“重启” →
e.Reason == SessionEndReasons.SystemShutdown
⚠️ 重要限制:
- 你只有极短时间(通常 5 秒内)执行清理操作
- 普通应用程序无法阻止关机/注销(只有系统服务在特定条件下可以请求延迟)
- 此时 UI 可能已冻结,不要弹窗(如 MessageBox),否则可能卡住关机流程
监听 Windows 交互式会话的状态变化,常用于检测:
- 用户是否 锁屏(Win+L)
- 用户是否 解锁屏幕
- 是否通过 远程桌面(RDP)连接/断开
| 事件 | 触发时机 | 用途 |
|---|---|---|
SessionLock |
用户锁屏(Win+L)或自动锁屏 | 暂停敏感操作、隐藏窗口 |
SessionUnlock |
用户输入密码解锁 | 恢复功能(如重新启动监听、勾选配置项) |
ConsoleDisconnect |
本地会话断开(如切换用户) | 清理资源 |
RemoteDisconnect |
远程桌面断开 | 停止远程相关功能 |
- 国产杀毒软件可能拦截 某些安全软件会阻止程序监听会话事件。