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

  在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;
}



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值