来自仅消息窗口的电源状态更改通知

时间:2012-02-15 17:12:32

标签: c++ windows

我有一个适用于Windows 7的Visual Studio 2008 C ++项目,我希望获得有关电源状态转换的通知(例如暂停,休眠,恢复等)。我创建了一个仅限消息的窗口来监视WM_POWERBROADCAST个消息。创建窗口后,我暂停PC。

例如(为简洁起见,省略了错误检查):

const TCHAR class_name[] = _T( "Power State Monitor" );
WNDCLASSEX wc = { 0 };
wc.cbSize = sizeof( WNDCLASSEX );
wc.lpfnWndProc = PowerStateMonitor;
wc.lpszClassName = class_name;
::RegisterClassEx( &wc );
::CreateWindowEx( 0, class_name, class_name, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, wc.hInstance, NULL );

::SetSuspendState( FALSE, FALSE, FALSE );

WindowProc看起来像这样:

LRESULT CALLBACK PowerStateMonitor( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    if( uMsg == WM_POWERBROADCAST )
    {
        ATLTRACE( L"WM_POWERBROADCAST:\r\n");
        return TRUE;
    }
    ATLTRACE( L"Default Handler: %#08x\r\n", uMsg );
    return ::DefWindowProc( hwnd, uMsg, wParam, lParam );
}

我希望看到WM_POWERBROADCAST:被记录,但我所看到的只是典型的窗口创建消息:

Default Handler: WM_GETMINMAXINFO
Default Handler: WM_NCCREATE
Default Handler: WM_NCCALCSIZE
Default Handler: WM_CREATE

有人可以建议我可以更改窗口以正确接收电源更改通知吗?

1 个答案:

答案 0 :(得分:1)

仅消息窗口不接收广播消息。您将不得不使用隐藏的普通窗口。来自MSDN,强调我的:

  

仅限消息的Windows

     

仅限消息窗口可让您发送和接收消息。它不可见,没有z顺序,无法枚举,不接收广播消息。该窗口只是发送消息。