首页 > 系统相关 >Qt监听Windows锁屏、解锁、休眠、唤醒、登录、注销消息

Qt监听Windows锁屏、解锁、休眠、唤醒、登录、注销消息

时间:2024-10-12 09:33:04浏览次数:9  
标签:case Qt Windows WM 锁屏 nativeEvent qDebug

环境:Windows 11 笔记本,其它环境未测试

根据其它博客的直接在窗口 nativeEvent 中监听 WM_WTSSESSION_CHANGE 会话消息和 WM_POWERBROADCAST 电源消息发现不起作用,查阅尝试后找到可行方法如下:

会话事件和电源消息都需要先用Windows API注册窗口句柄

void MainWindow::registerSysNotification()
{
#ifdef Q_OS_WINDOWS
    // 注册指定窗口以接收会话更改通知,获取锁屏,解锁,登录,注销等消息
    bool ret = WTSRegisterSessionNotification((HWND)this->winId(), NOTIFY_FOR_THIS_SESSION);
    qDebug() << "会话事件通知注册" << (ret ? "成功" : "失败");
    // 注册以便在系统暂停或恢复时接收通知,最低支持 win8
    HPOWERNOTIFY res = RegisterSuspendResumeNotification((HWND)this->winId(), DEVICE_NOTIFY_WINDOW_HANDLE);
    qDebug() << "电源事件通知注册" << (res != NULL ? "成功" : "失败");
#endif
}

注意:根据MSDN文档,WTSRegisterSessionNotificationRegisterSuspendResumeNotification 函数都只能用在 win8 及以上桌面系统中,不支持 win7。

然后在 nativeEvent 中处理消息

bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
#ifdef Q_OS_WIN32

    MSG* msg = (MSG*)message;
    switch (msg->message) {
    case WM_WTSSESSION_CHANGE://判断登录、注销、锁屏等
    {
        switch (msg->wParam) {
        case WTS_SESSION_LOCK:
            qDebug() << "锁屏";
            isScreenLock = true;
            break;
        case WTS_SESSION_UNLOCK:
            qDebug() << "解锁";
            isScreenLock = false;
            break;
        case WTS_SESSION_LOGON:
            qDebug() << "登录";
            break;
        case WTS_SESSION_LOGOFF:
            qDebug() << "注销";
            break;
        case WTS_SESSION_REMOTE_CONTROL:
            qDebug() << "被远程控制";
            break;
        default:
            break;
        }
    case WM_POWERBROADCAST:
    {
        switch (msg->wParam) {
        case PBT_APMSUSPEND:
            qDebug() << "系统进入休眠状态";
            isPowerSleep = true;
            break;
        case PBT_APMRESUMEAUTOMATIC:
            qDebug() << "系统从休眠状态恢复";
            isPowerSleep = false;
            break;
        case PBT_APMPOWERSTATUSCHANGE:
            qDebug() << "系统电源状态更改";
            break;
        default:
            break;
        }
    }
    }
    default:
        break;
    }

#endif
    return QMainWindow::nativeEvent(eventType, message, result);
}

标签:case,Qt,Windows,WM,锁屏,nativeEvent,qDebug
From: https://www.cnblogs.com/jixiaohua/p/18459844

相关文章

  • Invicti v24.10.0 for Windows - Web 应用程序安全测试
    Invictiv24.10.0forWindows-Web应用程序安全测试InvictiStandardv24.10.0–8October2024请访问原文链接:https://sysin.org/blog/invicti/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgInvicti是一种自动化但完全可配置的Web应用程序安全扫描程序,使......
  • 微软发布Windows 11 2024更新,新型Copilot+ AI PC功能亮相
    前言微软在Windows11的2024更新中加强了对人工智能的应用,推出了新功能Copilot+。此次更新的版本号为26100.1742,Copilot+将首先在WindowsInsider中推出,计划于11月向特定设备和市场推广,用户需开启“尽快获取最新更新”选项以接收此更新。系统获取https://pan.xunlei.com......
  • Qt初识_通过代码创建hello world
    个人主页:C++忠实粉丝欢迎点赞......
  • 最新Qt6将可执行文件打包为独立exe保姆级教学!含报错:无法定位程序输入点于动态链接库解
     相信大家都有类似的体验,自己已经在Qt练习中写出了不错的小程序,每次想发给别人体验都要发一整个大代码包,还得对面有对应的装好的QT才能运行,或者是想把自己的成果记录下来作为一个单独的exe文件却没有办法,今天教大家Qt如何生成独立可执行exe。注意:以下是Qt6之前版本可用的全过......
  • 在Linux中搭建WordPress并实现Windows主机远程访问
      WordPreWordPress是一个基于PHP开发的开源平台,适用于在支持PHP与MySQL数据库的服务器上搭建个性化博客或网站。同时,它也能够作为功能强大的内容管理系统(CMS)被广泛应用。虚拟机:VirtualBox虚拟机安装......
  • Linux下以编译源码的方式安装Qt5与Qt6及其使用
    文章目录概要资源下载依赖安装编译Qt5Qt6遇到的问题qtchooser使用概要自Qt5.15开始,不再提供opensourceofflineinstallers,也就是原来的.run的安装文件,只能通过源码编译来安装了参考文章资源下载源码网址,链接为Qt的资源,根据自己选择下载例如#下载源码......
  • WSL(Windows Subsystem for Linux)——简单的双系统开发
    文章目录WSLWSL的作用WSL的使用WSL的安装挂载磁盘的作用安装linux发行版wsl下载mysql,mongodb,redisWSL前言:本人由于在开发中需要linux环境,同时还想要直接在Windows下开发,来提升开发效率,随即简单学习WSL。WSL(WindowsSubsystemforLinux)是微软开发的一项技术,允许用......
  • 【Qt】详细Qt基础 (包括自定义控件)
    目录QT概述创建项目项目文件(.pro)main.cppmainwindow.uimainwindow.hmainwindow.cpp窗口类QWidget窗口显示QDialog窗口QPushButton创建显示对象树基本概念功能坐标体系控件ItemWidgetsQListWidgetQTreeWidgetQTableWidget自定义控件QT概述模块功能QtCore......
  • Windows多线程编程 互斥量和临界区使用
    Windows多线程编程允许程序同时运行多个线程,提高程序的并发性和执行效率。多线程编程中的核心概念包括线程的创建、同步、调度、数据共享和竞争条件等。本文详细介绍了Windows多线程编程的关键技术点,并解释如何使用线程同步机制来保证线程安全。1.线程基础概念1.1线......
  • 钉钉内网穿透工具-免费windows版
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档前言当我们处异地时,如何高效地访问公司内部网络资源成为了一个挑战。钉钉作为企业通讯和协作平台,支持内网穿透!这意味着即使您身在外地,也能像坐在办公室一样访问公司的内部系统和数据。听起来是不是很方......