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