0

我的问题是我之前的问题“ SetSuspendState() API 在 Win8 中永远不会返回”的延续

我在 Win8/Win8.1 m/c 上运行我的 VC++ 代码。

我的目的是让系统进入睡眠状态并再次自动使系统从睡眠状态恢复,而无需任何手动“鼠标点击或键盘敲击”。但是我无法实现“使系统进入睡眠状态,因此当然不会使系统从睡眠状态中恢复”。通过以下调用 SetSuspendState(),系统将始终进入休眠状态,而不是休眠。

我再次粘贴代码片段以供快速参考::

int wait = 100;
LARGE_INTEGER WaitTime;
    WaitTime.QuadPart = wait;
    WaitTime.QuadPart *= -10000000;

HANDLE hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
        if(0 == SetWaitableTimer(hTimer, &WaitTime, 0, NULL, NULL, TRUE))
        {
            res = false;
            return res;
        }
        if(0 == SetSuspendState(FALSE, FALSE, FALSE))
        {
            res = false;
            return res;
        }

在这里,我正在调用“SetSuspendState() API,并带有使系统进入睡眠状态和自动从睡眠状态恢复的选项,但系统只是进入休眠状态::

SetSuspendState(假,假,假)

任何人都可以帮助我解决这个问题以及如何让我的系统“以编程方式进入睡眠状态并自动从睡眠状态恢复,而无需手动“鼠标点击或键盘敲击”。

4

1 回答 1

0

在执行睡眠之前,我们应确保系统支持所需的睡眠状态并启用唤醒定时器,使用以下代码执行相同操作。

//Check support
    SYSTEM_POWER_CAPABILITIES sysPowCab = {0};
    if (CallNtPowerInformation(SystemPowerCapabilities, NULL, 0, &sysPowCab, sizeof(SYSTEM_POWER_CAPABILITIES)) != 0)
        {
            return false;
        }
        if (!sysPowCab.SystemS3)
        {
            return false;
        }
    return true;

//Enable allow wake up timer
    GUID *pPwrGUID;
    GUID subGUID = GUID_SLEEP_SUBGROUP;
    GUID BriGUID = GUID_ALLOW_RTC_WAKE;

    DWORD ret = PowerGetActiveScheme(NULL, &pPwrGUID);
    if (ret != ERROR_SUCCESS)
    {
        return false;
    }

    ret = PowerWriteACValueIndex(NULL, pPwrGUID, &subGUID, &BriGUID, 1);
    if (ret != ERROR_SUCCESS)
    {
        return false;
    }
    return true;
于 2017-08-08T15:49:20.427 回答