VC获得显示器状态(捕获息屏/亮屏事件)

来源:互联网 发布:mac自动关机 时间设置 编辑:程序博客网 时间:2024/04/29 10:06

  在vista版本之后, 应该注册GUID_CONSOLE_DISPLAY_STATE事件了, 上代码:

#include "stdafx.h"#include  <windows.h>#include <iostream>using namespace std;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 = _T("RenderWindow");  //【关键】该窗口类的名称  lvwcCls.hInstance = lvhInstance;   //【关键】表示创建该窗口的程序的运行实体代号  RegisterClass(&lvwcCls);HWND lvhwndWin = CreateWindow(_T("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;}else {cout << "Monitor is turn off" << endl;}//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(){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;}


原创粉丝点击