首页 > 编程语言 >C++第五十六篇——VC获取显示器状态(捕获熄屏/亮屏)

C++第五十六篇——VC获取显示器状态(捕获熄屏/亮屏)

时间:2024-03-25 15:44:56浏览次数:24  
标签:熄屏 VC 窗口 lvhInstance NULL EXE HWND 第五十六 lvwcCls

参考链接:https://blog.csdn.net/rocklee/article/details/76636253

此篇文章实现C++可以获取屏幕亮灭的消息,程序在后台运行,不会有控制台窗口显示。

第一步:新建一个控制台程序

 第二步:编写屏幕亮灭的代码

ScreenTest.cpp

#include  <windows.h>
#include <iostream>
using namespace std;
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

FILE* Log;

LRESULT CALLBACK WindowProc(
    _In_  HWND hwnd,
    _In_  UINT uMsg,
    _In_  WPARAM wParam,
    _In_  LPARAM lParam
);
HWND createMsgWin() {
    HINSTANCE lvhInstance;
    lvhInstance = GetModuleHandle(NULL);  //获取一个应用程序或动态链接库的模块句柄  
    WNDCLASS lvwcCls;
    lvwcCls.cbClsExtra = 0;
    lvwcCls.cbWndExtra = 0;
    lvwcCls.hCursor = LoadCursor(lvhInstance, IDC_ARROW);  //鼠标风格  
    lvwcCls.hIcon = LoadIcon(lvhInstance, IDI_APPLICATION);    //图标风格  
    lvwcCls.lpszMenuName = NULL; //菜单名  
    lvwcCls.style = CS_HREDRAW | CS_VREDRAW; //窗口的风格  
    lvwcCls.hbrBackground = (HBRUSH)COLOR_WINDOW;    //背景色  
    lvwcCls.lpfnWndProc = WindowProc;    //【关键】采用自定义消息处理函数,也可以用默认的DefWindowProc  
    lvwcCls.lpszClassName = L"RenderWindow";  //【关键】该窗口类的名称  
    lvwcCls.hInstance = lvhInstance;   //【关键】表示创建该窗口的程序的运行实体代号  

    RegisterClass(&lvwcCls);

    HWND lvhwndWin = CreateWindow(
        L"RenderWindow",           //【关键】上面注册的类名lpszClassName,要完全一致    
        L"Zombie",  //窗口标题文字    
        WS_OVERLAPPEDWINDOW, //窗口外观样式    
        0,             //窗口相对于父级的X坐标    
        0,             //窗口相对于父级的Y坐标    
        30,                //窗口的宽度    
        20,                //窗口的高度    
        NULL,               //没有父窗口,为NULL    
        NULL,               //没有菜单,为NULL    
        lvhInstance,          //当前应用程序的实例句柄    
        NULL);              //没有附加数据,为NULL    

    //去标题栏  

    return lvhwndWin;
}

LRESULT CALLBACK WindowProc(
    _In_  HWND hwnd,
    _In_  UINT uMsg,
    _In_  WPARAM wParam,
    _In_  LPARAM lParam
)
{
    //cout << "MSG:" << uMsg << ",wParam:" << wParam << ",lParam:" << lParam << endl;
    switch (uMsg)
    {

    case WM_POWERBROADCAST:
    {
        if (wParam == PBT_POWERSETTINGCHANGE) {
            POWERBROADCAST_SETTING* lvpsSetting = (POWERBROADCAST_SETTING*)lParam;
            byte lvStatus = *(lvpsSetting->Data);
            if (lvStatus != 0) {
                cout << "Monitor is turn on" << endl;
                fprintf(Log, "Monitor is turn on\n");
                fflush(Log);
            }
            else {
                cout << "Monitor is turn off" << endl;
                fprintf(Log, "Monitor is off\n");
                fflush(Log);
            }
            //cout << (int)lvStatus << endl;

        }
        break;
    }
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
HWND mhMsgRec;

BOOL WINAPI ConsoleHandler(DWORD pvdwMsgType)
{
    if (pvdwMsgType == CTRL_C_EVENT)
    {
        PostMessage(mhMsgRec, WM_DESTROY, 0, 0);
        return TRUE;
    }
    else if (pvdwMsgType == CTRL_CLOSE_EVENT)
    {
        PostMessage(mhMsgRec, WM_DESTROY, 0, 0);
        return TRUE;
    }
    return FALSE;
}

int main()
{
    errno_t err;

    // 尝试以写入模式打开文件  
    err = fopen_s(&Log, "D:\\ScreenTest.log", "w");
    if (err != 0) {
        perror("Error opening file");
        return EXIT_FAILURE;
    }

    // 写入数据到文件  
    fprintf(Log, "main\n");

    // 刷新输出缓冲区,确保数据被写入文件  
    fflush(Log);
    mhMsgRec = createMsgWin();//这个函数也是dll里的,得到控制台的句柄
    HPOWERNOTIFY lvhpNotify = RegisterPowerSettingNotification(mhMsgRec, &GUID_CONSOLE_DISPLAY_STATE, DEVICE_NOTIFY_WINDOW_HANDLE);
    SetConsoleCtrlHandler(ConsoleHandler, TRUE);
    bool lvbRet;
    MSG lvMSG;
    while ((lvbRet = GetMessage(&lvMSG, NULL, 0, 0)) != 0)
    {
        TranslateMessage(&lvMSG);
        DispatchMessage(&lvMSG);
        if (lvMSG.message == WM_DESTROY) {
            break;
        }
    }
    UnregisterPowerSettingNotification(lvhpNotify);
    CloseWindow(mhMsgRec);
    return 0;
}
View Code

 

第三步:生成EXE

 第四步:双击运行EXE,在任务管理器进程中检查EXE是否在后台运行

 第五步:在任务管理器中结束EXE任务,查看Log中是否有打印消息。

 至此,程序功能实现。

 

注意一点:#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")这句话就是让程序在后台运行。不过它还有个相关设置如下

 

标签:熄屏,VC,窗口,lvhInstance,NULL,EXE,HWND,第五十六,lvwcCls
From: https://www.cnblogs.com/smart-zihan/p/18094586

相关文章

  • MySQL中的MVCC实现机制
     MySQL中的MVCC实现机制   一、什么是MVCC?  MVCC,全称Multi-VersionConcurrencyControl,即多版本并发控制。MVCC是一种无锁的并发控制方法,一般在数据库管理系统中,用于实现对数据库的并发访问。  我们知道,在数据库中,对数据的操作主要有2中,分别是读和写,而在并发场景......
  • MySQL中的MVCC
    MySQL中的MVCC作用MVCC在MySQL中主要用于解决事务的隔离性,具体来说,不同的事务在同一时间点可以看到数据库不同的时间点快照,而不会被其他事务的修改所影响,主要是为了减少锁的使用,提升系统的并发能力.实现​TxID​:事务的ID,一个递增的值,值越大表示发生的时间越......
  • MVC设计模式的详解及应用
    文章目录一、MVC是什么二、MVC的优点三、MVC的应用领域一、MVC是什么MVC全名是ModelViewController,是一种软件设计典范,也是一个框架模式。它将应用程序分成三个核心部件:模型(Model)、视图(View)和控制器(Controller)。每个部件都有自己的任务和责任。模型(M......
  • Struts2的工作原理是什么?Struts2中的MVC模式包含哪些核心组件?在Struts2中如何实现转发
    Struts2的工作原理是什么?Struts2的工作原理主要基于MVC设计模式,它充当Web应用框架的控制器层(Controller),负责建立模型与视图之间的数据交互。具体来说,Struts2的工作流程如下:启动与加载:当Web应用启动时,服务器会加载web.xml配置文件。在这个过程中,StrutsPrepareAndExecuteFi......
  • SpringMVC中的拦截器Interceptor实现
    之前的文章介绍过两个拦截器(分别参考MyBatis功能点之二(2):从责任链设计模式的角度理解插件实现技术和SpringAOP之源码分析)。本文介绍的拦截器实现与它们有何异同呢?在SpringMVC拦截器(Interceptor)使用中已知实现了HandlerInterceptor接口,MVC会自动拦截。如何实现的呢?改造......
  • springMVC映射请求数据
    获取参数值@RequestParam@RequestParam表示会接收参数,value="name"表示接收的参数名为name,,required=false表示该参数可以没有,默认为truepackagecom.ysbt.requestparam;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.......
  • 房屋租赁系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图项目介绍随着城市化进程的加快和人口流动性增大,房屋租赁市场日益繁荣,对租赁信息的管理提出了更高要求。一个高效的房屋租赁系统能够为房东和租户提供一个便捷的信息发布......
  • ASPNET MVC POST DELETE PUT 请求返回 400 (Bad Request)
    近日遇到 POSTDELETEPUT请求返回400(BadRequest),而GET请求正常的情况经几日排查,发现是【防止ASP.NETMVC应用程序中的跨站点请求伪造(CSRF)攻击】导致的解决方法:在请求头中加入 RequestVerificationToken@injectMicrosoft.AspNetCore.Antiforgery.IAntif......
  • 宠物医院管理系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图项目介绍随着宠物行业的快速发展和宠物数量的不断增加,宠物医疗服务的需求日益旺盛。宠物医院管理系统作为一种专业的信息化工具,对于提升宠物医院的工作效率、优化顾客服......
  • 房屋中介房源管理系统的设计与实现(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图项目介绍随着房地产市场的蓬勃发展,房屋中介机构在房源管理和客户服务方面面临着日益增长的挑战。一个高效、可靠的房屋中介房源管理系统对于提升中介机构的工作效率、优......