Ashuimei 2023-05-09 13:12 采纳率: 50%
浏览 113
已结题

使用C++编写程序让系统进入睡眠后然后10秒后自动唤醒

在做一个如标题的程序,参考了Windows的API感觉有可行性,通过SetSuspendState 函数让系统睡眠,https://learn.microsoft.com/zh-cn/windows/win32/api/powrprof/nf-powrprof-setsuspendstate
然后参考Windows的API的系统唤醒事件https://learn.microsoft.com/zh-cn/windows/win32/power/system-wake-up-events
编写了如下程序,然而在系统睡眠后程序也不跑手动唤醒后才继续执行,有什么解决方法?
看Windows的文档应该是支持唤醒的,如图:

img

img

img


#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <stdio.h>
#include <powrprof.h>
#include <time.h>
#include <iostream>
#pragma comment(lib, "PowrProf.lib")

void Time()
{
    time_t timep;
    time(&timep);
    char tmp[64];
    strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S", localtime(&timep));
    std::cout << "currentTime is " << tmp << "." << std::endl;
}

int main()
{
    // 创建一个可等待的计时器对象
    HANDLE hTimer = CreateWaitableTimer(NULL, FALSE, NULL);
    if (hTimer == NULL)
    {
        printf("CreateWaitableTimer failed (%d)\n", GetLastError());
        return 1;
    }
    else {
        std::cout << "CreateWaitableTimer ";
        Time();
    }
    // 设置计时器为10秒后触发,并指定系统应唤醒
    LARGE_INTEGER liDueTime;
    liDueTime.QuadPart = -100000000LL; // 10秒
    if (!SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, TRUE))
    {
        printf("SetWaitableTimer failed (%d)\n", GetLastError());
        return 2;
    }
    else
    {
        std::cout << "SetWaitableTimer ";
        Time();
    }
        
    // 让系统进入睡眠状态
    std::cout << "SetSuspendState ";
    Time();
    SetSuspendState(FALSE, FALSE, FALSE);

    // 等待计时器信号
    if (WaitForSingleObject(hTimer, INFINITE) != WAIT_OBJECT_0)
    {
        printf("WaitForSingleObject failed (%d)\n", GetLastError());
        return 3;
    }
    else
    {
        std::cout << "WaitForSingleObjectl ";
        Time();

    }
        
    // 关闭计时器对象
    CloseHandle(hTimer);
    std::cout << "woken up ";
    Time();
    printf("The system has been woken up.\n");
    system("pause");
    return 0;
}

AI生成的请先验证能够正常使用,我这边尝试过GPT,newBing几个不同的AI均不能够实现目的。拒绝直接复制AI的答案。

  • 写回答

4条回答 默认 最新

  • centreon~ 2023-05-09 15:15
    关注
    获得3.00元问题酬金
    
    #include <iostream>
    #include <Windows.h>
    #include <PowrProf.h>
    
    #pragma comment(lib, "PowrProf.lib")
    
    int main()
    {
        // 让系统进入睡眠
        SetSuspendState(FALSE, TRUE, FALSE);
    
        // 注册系统唤醒事件
        HANDLE hWakeUpEvent = CreateEvent(NULL, FALSE, FALSE, L"MyWakeUpEvent");
        if (hWakeUpEvent == NULL)
        {
            std::cout << "CreateEvent failed: " << GetLastError() << std::endl;
            return 1;
        }
    
        // 设定唤醒时间
        SYSTEMTIME currentTime;
        GetSystemTime(&currentTime);
        FILETIME fileTime;
        SystemTimeToFileTime(&currentTime, &fileTime);
        ULARGE_INTEGER currentTimeLarge;
        currentTimeLarge.LowPart = fileTime.dwLowDateTime;
        currentTimeLarge.HighPart = fileTime.dwHighDateTime;
        ULARGE_INTEGER wakeUpTimeLarge;
        wakeUpTimeLarge.QuadPart = currentTimeLarge.QuadPart + 10000000; // 延迟10秒钟唤醒
        fileTime.dwLowDateTime = wakeUpTimeLarge.LowPart;
        fileTime.dwHighDateTime = wakeUpTimeLarge.HighPart;
    
        // 设置唤醒时间
        int result = SetWaitableTimer(hWakeUpEvent, (LARGE_INTEGER*)&fileTime, 0, NULL, NULL, FALSE);
        if (result == 0)
        {
            std::cout << "SetWaitableTimer failed: " << GetLastError() << std::endl;
            CloseHandle(hWakeUpEvent);
            return 1;
        }
    
        // 进入等待状态,等待系统唤醒事件的发生
        DWORD waitResult = WaitForSingleObject(hWakeUpEvent, INFINITE);
        if (waitResult != WAIT_OBJECT_0)
        {
            std::cout << "WaitForSingleObject failed: " << GetLastError() << std::endl;
            CloseHandle(hWakeUpEvent);
            return 1;
        }
    
        // 处理唤醒事件
        std::cout << "System is awake." << std::endl;
    
        CloseHandle(hWakeUpEvent);
    
        return 0;
    }
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 5月17日
  • 创建了问题 5月9日

悬赏问题

  • ¥15 Altair EDEM中生成一个颗粒,并且各个方向没有初始速度
  • ¥15 系统2008r2 装机配置推荐一下
  • ¥500 服务器搭建cisco AnyConnect vpn
  • ¥15 用大厂网站防红自己网站
  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊
  • ¥15 快速扫描算法求解Eikonal方程咨询
  • ¥20 我的是道格手机,重置后屏幕右上角出现红色字的未写入tee key 和未写入google key请问怎么去掉啊
  • ¥15 校内二手商品转让网站
  • ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?