VC++如何实时感知Windows系统进入和退出待机状态(附源码)

       在系统一段时间没有鼠标操作时系统可能会自动进入待机状态,进入待机状态后,很多程序将进入睡眠状态,网络也会断开。这样很多基于网络的程序与远程服务器的连接也被断开。在系统退出待机及网络恢复后,这些程序需要自动重连远端的服务器,即自动恢复与远端服务器的连接。那如何才能实时感知系统进入和退出待机状态呢?最近我们项目中也遇到了这个问题,本文就来大概地讲述一下。

1、实现思路

       Windows系统在进入待机和退出待机时,都会给相关的窗口发送WM_POWERBROADCAST通知消息,通过该消息中携带的WPARAM参数就能分辨出来是进入待机状态还是退出待机状态。
但Windows系统在进入和退出待机状态时,不会给所有的窗口都发送WM_POWERBROADCAST通知消息。如果想接收到该消息,需要调用API函数RegisterPowerSettingNotification,向系统注册用来接收WM_POWERBROADCAST通知消息的窗口。注册后,这个窗口就能收到WM_POWERBROADCAST通知消息了。在程序退出时,需要调用UnregisterPowerSettingNotification接口取消注册。

2、实现代码

       首先,调用系统API函数RegisterPowerSettingNotification向系统注册用来接收WM_POWERBROADCAST通知消息的窗口。调用RegisterPowerSettingNotification接口时要传入三个参数,第一个参数指定接收WM_POWERBROADCAST通知消息的窗口句柄;第二个参数设置为GUID_MONITOR_POWER_ON,表示关注系统待机;第三个参数设置为DEVICE_NOTIFY_WINDOW_HANDLE,指定当前使用窗口消息通知的方式。

GUID_MONITOR_POWER_ON的含义如下:

The primary system monitor has been powered on or off. This notification is useful for components that actively render content to the display device, such as media visualization. These applications should register for this notification and stop rendering graphics content when the monitor is off to reduce system power consumption. The Data member is a DWORD that indicates the current monitor state.

       RegisterPowerSettingNotification接口的返回值,在调用UnregisterPowerSettingNotification注销注册时要传入的参数,所以RegisterPowerSettingNotification接口的返回值要保存起来。相关代码如下:

// 注册休眠通知
GUID GUID_MON_POWER = GUID_MONITOR_POWER_ON;
HPOWERNOTIFY hPowerNtf = RegisterPowerSettingNotification( GetSafeHwnd(), &GUID_MON_POWER, DEVICE_NOTIFY_WINDOW_HANDLE );  

// ......

// 取消注册
UnregisterPowerSettingNotification(hPowerNtf);

       其次,在接收WM_POWERBROADCAST通知消息的窗口中添加拦截WM_POWERBROADCAST消息的代码,通过消息中携带的WPARAM参数值(标记码)来判别当前是进入待机还是退出待机。进入待机的标记码为PBT_APMSUSPEND,退出待机的标记码为PBT_APMRESUMEAUTOMATIC,相关代码如下所示:

if (WM_POWERBROADCAST == message)
{
    if ( wParam == PBT_APMSUSPEND)
    {
        // 进入待机    
    }
    else if ( wParam == PBT_APMRESUMEAUTOMATIC )
    {
        // 退出待机    
    }
}

你可能感兴趣的:(VC++常用功能代码封装,进入待机,退出待机,POWERBROADCAST)