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 远程桌面断开 停止远程相关功能
  1. 国产杀毒软件可能拦截 某些安全软件会阻止程序监听会话事件。