7,655
社区成员
发帖
与我相关
我的任务
分享
MSGQUEUEOPTIONS msgopts; //建消息队列的设置
HANDLE hMsgQueue; //消息队列句柄
HANDLE hPowerNotify; //请示电源消息的句柄
HANDLE hEvents[2];
POWER_BROADCAST *ppb; //得到消息队列传过来的电源通知信息
BYTE abBuffer[POWERMSGSIZE]; //通知信息的缓存
DWORD dwByteRead; //得到的消息队列的数据的大小
msgopts.dwSize = sizeof(MSGQUEUEOPTIONS); //消息队列的大小
msgopts.dwFlags = MSGQUEUE_NOPRECOMMIT; //在读了消息之后清除这个消息
msgopts.dwMaxMessages = 10; //设置队列最大的消息数,设为0就是不限制
msgopts.cbMaxMessage = POWERMSGSIZE; //每一个消息的最大字节数,这里指定是电源消息的大小
msgopts.bReadAccess = TRUE; //真为可读,false为可写
hMsgQueue = CreateMsgQueue(NULL, &msgopts); //建立消息队列,第一个参数为消息队列的名字
if (hMsgQueue == NULL) //如果为空,建立失败
{}else
{
GetSystemPowerStatusEx(msgopts, PBT_POWERINFOCHANGE);
}
hEvents[0] = hMsgQueue; //消息队列句柄
hEvents[1] = m_hCloseThreadEvent; //结束事件的句柄
__try {
while ( (dwEventRet = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE)) != WAIT_FAILED )
{
if ( dwEventRet != WAIT_OBJECT_0 ) //如果不是电源通知事件,结束
{
StopPowerNotifications(hPowerNotify) //停止通知
break;
}
ppb = (POWER_BROADCAST *)abBuffer; //指向缓存
while (ReadMsgQueue(hMsgQueue, ppb, POWERMSGSIZE, &dwByteRead, 0, &dwFlags)) //POWERMSGSIZE, 指定缓存的大小, dwByteRead:得到的数据的字节大小
//读取超时时间。0:如果没有数据,不会堵塞。INFINITE:一直读,直到有数据。
//dwFlags得到消息队列的属性(MSGQUEUE_MSGALERT 指明是警告消息)
{//dosomething }
}
__except (EXCEPTION_EXECUTE_HANDLER)
{ throw;}
}