C++ 如何使系统进入睡眠状态&;再次自动(按程序)从睡眠中恢复,无需任何手动操作;鼠标点击或键盘点击

C++ 如何使系统进入睡眠状态&;再次自动(按程序)从睡眠中恢复,无需任何手动操作;鼠标点击或键盘点击,c++,winapi,visual-c++,windows-8,sleep,C++,Winapi,Visual C++,Windows 8,Sleep,我的问题是上一个问题的继续“ 我正在Win8/Win8.1 m/c上运行我的VC++代码 我的目的是让系统进入睡眠状态&再次恢复系统 从睡眠自动无需任何手动“鼠标点击或键盘 击中”。 但我无法实现“让系统进入睡眠状态,因此当然不会使系统从睡眠状态恢复。”通过下面的调用SetSuspendState(),系统将始终处于休眠状态,而不是睡眠状态 我再次粘贴代码片段以供快速参考: int wait = 100; LARGE_INTEGER WaitTime; WaitTime.QuadPart

我的问题是上一个问题的继续“

我正在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(假、假、假)

有人能帮我解决这个问题吗?我如何“按程序”让我的系统进入睡眠状态,并在没有手动“点击鼠标或键盘”的情况下自动恢复睡眠状态

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


“睡眠”通常不是一种完全没有程序运行的状态吗?@Plasmah:是的,但是@codeLover:我可以确认系统进入休眠而不是休眠吗?@Mats Peterson::是的,系统进入休眠而不是休眠。这是显而易见的,因为在我执行这个API SetSuspendState()之后,监视器会关闭,即使在鼠标单击或键盘敲击之后,它也不会回来,只需要按下电源按钮就可以回来。同时,在恢复返回时,我看到了带有windows徽标的windows启动屏幕,这仅在重新启动或休眠期间才可见。很明显,系统正在进入休眠而不是休眠状态。所以,正如他们所说,“这是你的问题”。我不确定您的设置中可能存在什么确切的潜在原因,但很明显,您并没有在调用中要求休眠(第一个BOOL值),因此这是“其他原因迫使系统休眠”。可能是BIOS设置,甚至是BIOS中的错误。或者电源管理设置中的一些设置,上面写着“请休眠而不是休眠”。
//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;