电源通知 RequestPowerNotifications

当系统的电源状态该变时,可以通过RequestPowerNotifications要求电源管理器向自己发送一个通知

 

HANDLE RequestPowerNotifications(

  HANDLE hMsgQ,

  DWORD Flags

);

 

示例:

 

#include <windows.h>

#include <pm.h>

#include <Winbase.h>

 

#define MAX_NOTIFY_NAMELEN          128

#define PM_BROADCAST_QUEUE_SIZE     ((sizeof(POWER_BROADCAST) + (MAX_NOTIFY_NAMELEN * sizeof(WCHAR) ) ) )

 

#define SIZEOFARRAY(a)  (sizeof(a) / sizeof(a[0]))

 

void IlockDThreadProc(void)

{

     MSGQUEUEOPTIONS mqo;

     HANDLE hPowerMsgQ;

     HANDLE hPowerNotifications;

     DWORD cbRead;

    DWORD dwFlags;       

     DWORD cbPowerMsgSize =  PM_BROADCAST_QUEUE_SIZE;  

     DWORD dwPwrFlags;

    TCHAR szPowerState[32];

 

    

     POWER_BROADCAST ppb;

    union {                

         WCHAR buf[PM_BROADCAST_QUEUE_SIZE];

         POWER_BROADCAST powerBroadcast;

     } u;

 

     printf("IlockDThreadProc/n");

    

     mqo.dwSize = sizeof(MSGQUEUEOPTIONS);

    mqo.dwFlags = MSGQUEUE_NOPRECOMMIT;

    mqo.dwMaxMessages = 32;

    mqo.cbMaxMessage = cbPowerMsgSize;

    mqo.bReadAccess = TRUE;             

   

    hPowerMsgQ = CreateMsgQueue(NULL, &mqo);

    if (NULL == hPowerMsgQ) {

        printf("/r/n/r/nCreateMsgQueue failed: %x/n", GetLastError());

        goto Error;              

    }

   

hPowerNotifications = RequestPowerNotifications(hPowerMsgQ, PBT_ALL);

if (NULL == hPowerNotifications)    {

        printf("RequestPowerNotifications failed: %x/n", GetLastError());

        goto Error;

    }

 

    while(1)  {

    WaitForSingleObject(hPowerMsgQ,INFINITE);     

        

    if (!ReadMsgQueue(hPowerMsgQ, &u, cbPowerMsgSize, &cbRead, 0, &dwFlags))   {     

         printf("ReadMsgQueue failed: %x/n", GetLastError());

            ASSERT(FALSE);

        }         

 

         ppb = u.powerBroadcast;         

 

        switch(ppb.Message) {       

        case PBT_TRANSITION:                     

                   printf("##############################ppb.Message PBT_TRANSITION/n");

                       

                   GetSystemPowerState(szPowerState,SIZEOFARRAY(szPowerState),&dwPwrFlags);

                  

                  

                   if(!wcscmp(TEXT("backlightoff"),szPowerState)) {

                       printf("BacklightOff/n");

                        break;

                   }

 

                   if(!wcscmp(TEXT("unattended"),szPowerState))   {

                       printf("unattended/n");

                       break;

                   }

                  

              break;

        case PBT_RESUME:

                   printf("##############################ppb.Message PBT_RESUME/n");

              break;

        case PBT_POWERSTATUSCHANGE:

                   printf("************************ppb.Message PBT_POWERSTATUSCHANGE/n");

              break;

              case PBT_POWERINFOCHANGE:

                   printf("##############################ppb.Message PBT_POWERINFOCHANGE/n");

              break;

        default:

                   printf("##############################ppb.Message default/n");

              break;  

        }         

        

     }   

 

Error:

    if (hPowerMsgQ)

        CloseMsgQueue(hPowerMsgQ); 

    if (hPowerNotifications)

        StopPowerNotifications(hPowerNotifications); 

}

 

int _tmain(void)

{       

     CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)IlockDThreadProc,0,0,NULL);

 

     while(1) {

         Sleep(1000);

     }

}

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值