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

程序运行时阻止Windows 10进入睡眠的VB.NET代码无效求助

解决VB.NET中SetThreadExecutionState无法阻止系统睡眠的问题

你的代码没能成功阻止系统睡眠,核心是两个关键问题没处理到位:

  • 缺少ES_CONTINUOUS标记:这个标记是告诉Windows持续维持当前唤醒状态,如果只传ES_SYSTEM_REQUIRED,它只会临时重置一次系统空闲计时器,之后系统还是会触发睡眠机制。
  • 没有处理程序退出后的状态恢复:如果不手动重置状态,程序退出后系统可能会一直保持唤醒模式,影响正常的睡眠策略。

修正后的完整代码

Imports System.Runtime.InteropServices

Public Class Form1
    <FlagsAttribute()>
    Public Enum EXECUTION_STATE As UInteger
        ES_SYSTEM_REQUIRED = &H1
        ES_DISPLAY_REQUIRED = &H2
        ES_CONTINUOUS = &H80000000UI
    End Enum

    <DllImport("Kernel32.DLL", CharSet:=CharSet.Auto, SetLastError:=True)>
    Private Shared Function SetThreadExecutionState(ByVal state As EXECUTION_STATE) As EXECUTION_STATE
    End Function

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' 组合标记:持续保持系统和显示器处于唤醒状态
        SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS Or EXECUTION_STATE.ES_SYSTEM_REQUIRED Or EXECUTION_STATE.ES_DISPLAY_REQUIRED)
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        ' 程序退出时恢复系统默认的睡眠策略
        SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS)
    End Sub
End Class

关键细节说明

  • ES_CONTINUOUS是核心:没有这个标记,你的调用只会一次性刷新空闲计时器,无法持续阻止睡眠。
  • 按需选择ES_DISPLAY_REQUIRED:如果不需要阻止显示器关闭,可以去掉这个标记,只保留ES_CONTINUOUS | ES_SYSTEM_REQUIRED。
  • 必须重置状态:程序关闭时一定要调用SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS),让系统恢复默认的睡眠逻辑,避免遗留异常状态。

你可以测试下这个修正后的代码,应该就能正常阻止系统进入睡眠/待机/休眠状态了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:35:15