You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SetThreadExecutionState维持电脑开机时出现编译错误,求解决方案

解决SetThreadExecutionState()编译错误的常见方案

嘿,我之前也碰到过这个问题,折腾了好一会儿才搞定。你遇到的编译错误,大概率是几个容易忽略的小细节导致的,咱们一步步来排查:

1. 去掉重复的头文件引用

Windows SDK里的<windows.h>已经包含了<winbase.h>,你单独再包含一遍反而可能引发头文件重复定义的冲突。直接删掉#include <winbase.h>这一行就好。

2. 确保链接正确的系统库

SetThreadExecutionState()是kernel32.dll里的函数,编译的时候需要链接kernel32.lib。有两种方式解决:

  • 在代码开头添加编译指令:#pragma comment(lib, "kernel32.lib")(MSVC编译器适用)
  • 如果用MinGW编译,在编译命令里加上-lkernel32参数,比如:g++ your_code.cpp -o your_program -lkernel32

3. 检查函数调用的参数是否正确

调用这个函数时必须使用正确的状态常量,常见的组合是ES_CONTINUOUS | ES_SYSTEM_REQUIRED(防止系统休眠)或者ES_CONTINUOUS | ES_DISPLAY_REQUIRED(防止屏幕关闭),如果常量未定义,大概率是头文件没正确包含(但去掉重复引用后应该就解决了)。

修正后的完整示例代码

#include <iostream>
#include <windows.h>
#include <conio.h>

#pragma comment(lib, "kernel32.lib") // MSVC下自动链接kernel32库

int main() {
    // 调用函数,阻止系统休眠,同时保持后续状态持续生效
    EXECUTION_STATE previousState = SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED);
    
    if (previousState == NULL) {
        std::cerr << "调用失败!错误代码:" << GetLastError() << std::endl;
        return 1;
    }

    std::cout << "系统休眠已被阻止,按任意键恢复..." << std::endl;
    _getch(); // 等待用户输入

    // 恢复之前的系统执行状态,避免电脑一直保持唤醒
    SetThreadExecutionState(previousState);
    return 0;
}

额外提醒

  • 如果你用的是较旧的Windows SDK版本,可能需要确认常量是否存在,不过主流的VS版本和MinGW都已经支持这些定义。
  • 记得程序退出前一定要恢复之前的状态,否则电脑会一直处于唤醒状态,除非重启。

内容的提问来源于stack exchange,提问作者Doshorte Dovencio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:22:49