2012-02-15 33 views
0

我有一个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

仅消息窗口不接收广播消息。您将不得不使用隐藏的普通窗口。从MSDN,重点煤矿:

消息只有Windows

的消息,唯一窗口,您可以发送和接收消息。它不可见,没有z顺序,不能枚举,并且未收到广播消息。窗口只是发送消息。