none
Window 10 System 检测系统是否睡眠 RRS feed

  • 问题

  • Hi MS,

           我在网上看了系统睡眠时会发送WM_POWERBROADCAST消息,但我在Window 10 系统上一直没捕获到该消息,仔细看了下好像只支持XP系统。 请问Win 10系统上是如何捕获到WM_POWERBROADCAST消息?

    2021年3月4日 2:26

全部回复

  • 您好,

    感谢您在MSDN中文论坛发帖提问。

    >>Window 10 System 检测系统是否睡眠

    我认为你很难通过捕获WM_POWERBROADCAST消息来确认win10系统是否睡眠。因为在系统睡眠模式下, 某些进程(c++代码)也将进入睡眠模式。

    WM_POWERBROADCAST消息是关于电源模式更改时发出的信号的。因此,您可以使用它来检查系统何时将进入睡眠状态,或者它刚刚醒来。而不能检测系统此时是否正在休眠。

    如果你想检测系统此时是否正在休眠, 我建议你可以尝试下面这种方案:以已知的时间间隔检查系统时钟。如果两个测得的系统时钟之间有很大的时间间隔,则意味着从现在到上次测量之间的某个时间,系统进入睡眠状态并醒了。如果您选择的测量间隔小于可能最快的睡眠/唤醒周期则此方法可能实用。

    >>请问Win 10系统上是如何捕获到WM_POWERBROADCAST消息?

    根据文档:WM_POWERBROADCAST message ,最低支持的系统是Windows XP, 所以win10系统是支持该消息的。

    您将必须使用RegisterPowerSettingNotification函数进行注册以接收PowerSettingNotificationEvents。在GUI应用程序中,您为窗口提供一个句柄,该窗口将在每次系统即将更改状态(挂起模式或休眠模式之一)时接收WM_POWERBROADCAST消息。而对于非 GUI,其使用SERVICE_CONTROL_POWEREVENT的dwControl参数和PBT_POWERSETTINGCHANGE的dwEventType注册HandlerEx回调。

    关于GUI应用程序, 我建议你可以参考这个链接:https://stackoverflow.com/questions/7253714/get-notified-about-windows-is-going-to-sleep-waking-up-in-c

    关于非GUI应用程序, 我建议你可以参考这个文档:https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nc-winsvc-lphandler_function_ex

    Best Regards,

    Jeanine


    "Visual c++" forum will be migrating to a new home on Microsoft Q&A !
    We invite you to post new questions in the "Developing Universal Windows apps" forum’s new home on Microsoft Q&A !
    For more information, please refer to the sticky post.

    2021年3月4日 6:58
    版主