关于Windows的通知将在C ++中进入睡眠状态/唤醒状态

时间:2011-08-31 07:14:21

标签: c++ winapi

我正在开发一个App,它有多个线程等待来自DLL和串行端口的不同输入。

我想添加一个功能,在机器进入睡眠状态之前,我必须卸载某些DLL并且在唤醒时必须重新加载DLL。 为此,我需要通知睡眠和醒来。

我发现很多关于在C#中执行的文件,但我想在C ++中执行此操作。

我尝试使用此code Project但无法捕获任何事件。我删除了与Window Paint和All相关的所有内容,因为我不需要它的GUI并仅保留main message loop (The While loop in the main)

编辑: -

我使用它作为我的主循环: -

 // Start the message loop. 

while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{ 
    if (bRet == -1)
    {
        // handle the error and possibly exit
    }
    else
    {
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    }
} 

坦白说,我已经从CodeProject复制了这个,并且只做了一次修改,即从MSDN文章中检查了GetMessage(..)!= 0。

我错过了什么吗?

或任何其他解决方案??

我正在使用VS2010并使用C ++进行编程

提前致谢!

1 个答案:

答案 0 :(得分:7)

尝试处理WM_POWERBROADCAST消息

这是应该有效的示例代码。显然你需要创建一个窗口,否则你不会收到消息。该示例创建了一个隐藏窗口来实现此目的。

static long FAR PASCAL WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    if(message == WM_POWERBROADCAST)
    {
        //Do something
        return TRUE;
    }
    else
        return DefWindowProc(hWnd, message, wParam, lParam);
}

int _tmain(int argc, _TCHAR* argv[])
{
    WNDCLASS wc = {0};


    // Set up and register window class
    wc.lpfnWndProc = WindowProc;
    wc.lpszClassName = _T("SomeNameYouInvented");
    RegisterClass(&wc);
    HWND hWin = CreateWindow(_T("SomeNameYouInvented"), _T(""), 0, 0, 0, 0, 0, NULL, NULL, NULL, 0);

    BOOL bRet;
    MSG msg;
    while( (bRet = GetMessage( &msg, hWin, 0, 0 )) != 0)
    { 
        if (bRet == -1)
        {
            // handle the error and possibly exit
        }
        else
        {
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        }
    }
    return 0;
}