📄 demo.cpp
字号:
// demo.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "demo.h"
#include "demoDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CdemoApp
BEGIN_MESSAGE_MAP(CdemoApp, CWinApp)
END_MESSAGE_MAP()
#include "Pm.h"
#include "Msgqueue.h"
CdemoDlg g_dlg;
#define QUEUE_ENTRIES 3
#define MAX_NAMELEN 200
#define QUEUE_SIZE (QUEUE_ENTRIES * (sizeof(POWER_BROADCAST) + MAX_NAMELEN))
HANDLE hMsgQ;
HANDLE g_hEventDlgQuit;
#define DLGRUNING _T("SCREENSVAEDLG_RUNING")
DWORD WINAPI CreateDlgThread(void * temp_p)
{
g_hEventDlgQuit = CreateEvent(0,FALSE,FALSE,DLGRUNING);
if(GetLastError()==ERROR_ALREADY_EXISTS)
return 0;
g_dlg.CreateDlg();
MSG msg;
while(1)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (!GetMessage(&msg, NULL, 0, 0))
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
DWORD dw = WaitForSingleObject(g_hEventDlgQuit,50);
if(dw!=WAIT_TIMEOUT)
{
g_dlg.DestroyDlg();
break;
}
}
}
CloseHandle(g_hEventDlgQuit);
return 0;
}
DWORD WINAPI PowerChangeListen(void * temp_p)
{
UCHAR buf[QUEUE_SIZE];
unsigned long nRead = 0, flags = 0, res = 0;
int i;
i = 0;
MSG msg;
while(1)
{
DWORD dwRes = WaitForSingleObject(hMsgQ,INFINITE);
if(dwRes==WAIT_OBJECT_0)
{
memset(&buf, 0, QUEUE_SIZE);
if (ReadMsgQueue(hMsgQ, &buf, QUEUE_SIZE, &nRead, INFINITE, &flags))
{
PPOWER_BROADCAST pB = (PPOWER_BROADCAST)&buf;
PPOWER_BROADCAST_POWER_INFO ppbpi = (PPOWER_BROADCAST_POWER_INFO) pB->SystemPowerState;
if(_tcscmp(pB->SystemPowerState,_T("backlightoff"))==0)
{
CreateThread(NULL, 0, CreateDlgThread, NULL, 0, NULL);
}
else if(_tcscmp(pB->SystemPowerState,_T("on"))==0)
{
SetEvent(g_hEventDlgQuit);
}
if(pB->Message==PBT_POWERINFOCHANGE)
{
//在这里处理一些电池信息相关数据改变的事情
// MessageBox(NULL,L"Battery info change",NULL,NULL);
NKDbgPrintfW(TEXT("[Fred]Battery info change BatteryLifePercent=%d\r\n"),ppbpi->bBatteryLifePercent);
}
if(pB->Message==PBT_POWERSTATUSCHANGE)
{
//在这里处理一些电源输入状态改变 (AC/Battery)的事情
//MessageBox(NULL,L"Power input change",NULL,NULL);
NKDbgPrintfW(TEXT("[Fred]Power input change ACIN=%d\r\n"),ppbpi->bACLineStatus);
}
if(pB->Message==PBT_TRANSITION)
{
NKDbgPrintfW(TEXT("[Fred]Power PBT_TRANSITION ACIN=%d\r\n"),ppbpi->bACLineStatus);
}
if(pB->Message==PBT_RESUME)
{
NKDbgPrintfW(TEXT("[Fred]Power PBT_RESUME ACIN=%d\r\n"),ppbpi->bACLineStatus);
}
}
}
/*
i++;
Sleep(100);
if(i == 100)
{
g_dlg.CreateDlg();
}
else if(i == 300)
{
i = 0;
g_dlg.DestroyDlg();
}
*/ }
return 0;
}
void Init_PowerNotify()
{
NKDbgPrintfW(TEXT("[Fred]Init_PowerNotify++\r\n"));
MSGQUEUEOPTIONS options = {0};
DWORD dwErr;
options.dwSize = sizeof(MSGQUEUEOPTIONS);
options.dwFlags = 0;
options.dwMaxMessages = QUEUE_ENTRIES;
options.cbMaxMessage = sizeof(POWER_BROADCAST) + MAX_NAMELEN;
options.bReadAccess = TRUE;
hMsgQ = CreateMsgQueue(NULL, &options);
if(!hMsgQ)
{
dwErr=GetLastError();
NKDbgPrintfW(TEXT("[Fred]CreateMsgQueue failed\r\n"));
RETAILMSG(1, (TEXT("[Fred]CreateMessageQueue ERROR:%d\n"), dwErr));
return;
}
HANDLE hNotifications = RequestPowerNotifications(hMsgQ, POWER_NOTIFY_ALL); // Flags
if (!hNotifications) {
dwErr = GetLastError();
RETAILMSG(1, (TEXT("[Fred]RequestPowerNotifications ERROR:%d\n"), dwErr));
StopPowerNotifications(hMsgQ);
return;
}
CreateThread(NULL, 0, PowerChangeListen, NULL, 0, NULL);
NKDbgPrintfW(TEXT("[Fred]Init_PowerNotify--\r\n"));
}
// CdemoApp construction
CdemoApp::CdemoApp()
: CWinApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
// The one and only CdemoApp object
CdemoApp theApp;
// CdemoApp initialization
BOOL CdemoApp::InitInstance()
{
m_pMainWnd = &g_dlg;
g_dlg.DoModal();
// Init_PowerNotify();
//while(1)
//{
// Sleep(1000);
//}
// g_dlg.DestroyDlg();
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -