You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 00:24:05