⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demo.cpp

📁 smartphone 监听电源状态源码
💻 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 + -