【问题标题】:Get Notified about Windows is Going to Sleep/Waking up in C++获取有关 Windows 将在 C++ 中休眠/唤醒的通知
【发布时间】:2011-08-31 07:14:20
【问题描述】:

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

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

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

我尝试使用此code Project,但无法捕获任何事件。我删除了与 Window Paint 相关的所有内容,因为我不需要它的 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++ 编程

提前致谢!

【问题讨论】:

  • 如果有人正在关闭您的程序 (WM_CLOSE) 并关闭系统有什么区别?
  • @RedX 我还没有处理这个事件,但是当进程被杀死时,DLL 会在关闭或关闭的情况下卸载。
  • 哦,忽略我的消息。睡眠不关机。
  • 在这种情况下,向我们展示您的消息循环会很有帮助。
  • TranslateMessage 是做什么的,您在哪里捕获了 WM_PAINT 和其他类似事件?在您解析 WM_PAINT 的地方,您需要捕获 WM_POWERBROADCAST 并在那里检查 PBT_* 事件。也许你应该在继续之前搜索 WINAPI 和窗口消息循环的介绍。

标签: c++ winapi


【解决方案1】:

尝试处理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;
}

【讨论】:

  • 是的……我明白了……但不明白怎么做……我是 C++ 和 WINAPI 的新手……
  • 当您使用 RegisterClass 函数注册您的窗口时,您指定您的 windowproc。您编写的windowproc函数中的参数uMsg是您应该测试的参数,如果它是WM_POWERBROADCAST。
  • 如果我没有任何窗口或 GUI 怎么办?我正在构建一个无需用户干预即可在后台运行的应用程序:(
  • 如果不创建窗口,请不要使用 translate/dispatch 并将 msg.message 的值与 WM_POWERBROADCAST 进行比较。
  • 但是我已经使用 RegisterClass 来指定我的 WndProc 函数。那么如果我没有任何窗口,我应该将什么传递给 RegisterClass?
猜你喜欢
  • 1970-01-01
  • 2011-08-05
  • 2011-02-10
  • 2012-07-19
  • 2012-08-15
  • 2015-05-28
  • 2021-09-11
  • 2014-08-02
  • 1970-01-01
相关资源
最近更新 更多