使用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
相关产品推荐
相关产品推荐

