Windows 11如何重置系统空闲计时器?SetThreadExecutionState(ES_SYSTEM_REQUIRED)失效
重置Windows 11系统空闲计时器的可行方法
之前仅调用SetThreadExecutionState(ES_SYSTEM_REQUIRED)(不带ES_CONTINUOUS参数)的方式在Windows 11中已无法重置系统空闲计时器,以下是当前可行的实现方式:
方法一:调整SetThreadExecutionState参数组合
通过同时指定ES_SYSTEM_REQUIRED和ES_DISPLAY_REQUIRED参数调用API,可有效重置空闲计时器,同时临时阻止系统和显示器进入休眠状态。如果仅需重置计时器而不想长期阻止休眠,可在调用后立即恢复系统默认状态:
// 重置空闲计时器并临时阻止休眠 SetThreadExecutionState(ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED); // 立即恢复系统默认休眠策略 SetThreadExecutionState(ES_CONTINUOUS);
若需要持续阻止系统进入空闲状态(而非单次重置),则可以保留ES_CONTINUOUS参数:
// 持续阻止系统进入空闲状态(需在程序退出前恢复) SetThreadExecutionState(ES_SYSTEM_REQUIRED | ES_CONTINUOUS); // 程序退出时恢复默认状态 SetThreadExecutionState(ES_CONTINUOUS);
方法二:模拟用户输入操作
通过模拟微小的用户输入(如鼠标移动、键盘按键),系统会判定用户处于活跃状态,自动重置空闲计时器。示例代码(使用SendInput模拟鼠标移动):
INPUT input = {0}; input.type = INPUT_MOUSE; input.mi.dx = 1; // 微小移动X坐标 input.mi.dy = 1; // 微小移动Y坐标 input.mi.mouseData = 0; input.mi.dwFlags = MOUSEEVENTF_MOVE; SendInput(1, &input, sizeof(INPUT)); // 可再移回原位置,避免影响用户操作 input.mi.dx = -1; input.mi.dy = -1; SendInput(1, &input, sizeof(INPUT));
这种方法完全模拟真实用户操作,兼容性好,但需注意避免频繁模拟导致的系统资源占用或用户干扰。
方法三:使用PowerSetRequest API(适用于更精细的电源控制)
通过PowerSetRequest函数向系统发送电源请求,指定PowerSystemRequired类型,同样可重置空闲计时器。示例代码:
HANDLE hPowerRequest = PowerCreateRequest(&PowerRequestContext); if (hPowerRequest != INVALID_HANDLE_VALUE) { PowerSetRequest(hPowerRequest, PowerSystemRequired); // 重置完成后取消请求 PowerClearRequest(hPowerRequest, PowerSystemRequired); CloseHandle(hPowerRequest); }
该API提供更灵活的电源管理控制,适合需要精细控制电源状态的场景。
内容的提问来源于stack exchange,提问作者Anton111111
相关产品推荐
相关产品推荐

