如何在C++控制台程序中捕获Windows系统锁屏事件
实现方案
Windows 系统的锁屏、解锁事件属于会话状态变更事件,可以通过注册WTS(Windows终端服务)会话通知捕获,控制台程序只需创建隐藏消息窗口处理系统通知即可实现需求,具体实现步骤如下:
步骤1:引入依赖
需要引入Windows系统API相关头文件,同时链接wtsapi32.lib库:
#include <windows.h> #include <wtsapi32.h> #include <iostream> // MSVC 编译器可直接用pragma指令链接库,MinGW等编译器需添加编译参数 -lwtsapi32 #pragma comment(lib, "wtsapi32.lib")
步骤2:定义消息处理逻辑
创建隐藏的消息窗口用于接收系统发送的会话变更通知,当收到锁屏事件时触发退出逻辑:
// 窗口消息处理回调 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { if (msg == WM_WTSSESSION_CHANGE) { // wParam为WTS_SESSION_LOCK代表触发锁屏事件 if (wParam == WTS_SESSION_LOCK) { std::cout << "检测到系统锁屏,程序即将退出" << std::endl; // 发送退出消息终止消息循环 PostQuitMessage(0); } } return DefWindowProc(hwnd, msg, wParam, lParam); }
步骤3:注册通知并启动消息循环
主函数中完成窗口注册、会话通知注册,运行消息循环持续监听系统事件:
int main() { // 注册隐藏消息窗口的类 const wchar_t CLASS_NAME[] = L"LockScreenListenerWindowClass"; WNDCLASSEX wc = {0}; wc.cbSize = sizeof(WNDCLASSEX); wc.lpfnWndProc = WndProc; wc.hInstance = GetModuleHandle(NULL); wc.lpszClassName = CLASS_NAME; RegisterClassEx(&wc); // 创建隐藏窗口,不需要显示 HWND hwnd = CreateWindowEx( 0, CLASS_NAME, L"LockScreenListener", 0, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, GetModuleHandle(NULL), NULL ); if (hwnd == NULL) { std::cerr << "创建消息窗口失败,错误码:" << GetLastError() << std::endl; return 1; } // 注册当前会话的状态变更通知 if (!WTSRegisterSessionNotification(hwnd, NOTIFY_FOR_THIS_SESSION)) { std::cerr << "注册会话通知失败,错误码:" << GetLastError() << std::endl; return 1; } std::cout << "程序运行中,系统锁屏后将自动退出..." << std::endl; // 消息循环,持续接收系统消息 MSG msg; while (GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } // 退出前清理资源 WTSUnRegisterSessionNotification(hwnd); DestroyWindow(hwnd); UnregisterClass(CLASS_NAME, GetModuleHandle(NULL)); return 0; }
注意事项
- 如果你的程序有其他需要并行运行的业务逻辑,可以把消息循环放到独立线程运行,避免阻塞业务代码
- 该方案兼容Windows 7及以上所有系统版本,Windows 10/11全版本适配
内容的提问来源于stack exchange,提问作者Neptune
相关产品推荐
相关产品推荐

