让你的电脑患上睡眠呼吸暂停——别让它睡觉
一个实用工具,用于防止工作站进入睡眠状态(在长时间运行的进程期间)。
引言
睡眠呼吸暂停通常不是一件好事,但我需要防止我们的工作站进入睡眠状态。我们的域工作站会在第三方模型运行的中途进入睡眠状态,并且组策略会覆盖任何本地电源设置。
这个解决方案解决了什么问题?
这个 Visual Basic (2010) 实用工具使用 SetThreadExecutionState
API 来告知系统它正在使用中,从而防止系统在应用程序运行时进入睡眠状态或关闭显示器。系统会自动检测活动,例如本地键盘或鼠标输入、服务器活动以及窗口焦点更改(这些都会阻止系统进入睡眠状态)。但是磁盘、CPU 活动和视频显示是不会自动检测到的活动(并且长时间运行的进程不足以使系统保持唤醒状态)。
代码是如何工作的?
应用程序在表单加载时调用 SetThreadExecutionState
API 一次。只要此应用程序正在运行,系统就不会进入睡眠状态(或关闭显示器)。
' API call to prevent sleep (until the application exits)
Private Declare Function uses the SetThreadExecutionState Lib _
"kernel32" (ByVal esflags As EXECUTION_STATE) As EXECUTION_STATE
' Define the API execution states
Private Enum EXECUTION_STATE
' Stay in working state by resetting display idle timer
ES_SYSTEM_REQUIRED = &H1
' Force display on by resetting system idle timer
ES_DISPLAY_REQUIRED = &H2
' Force this state until next ES_CONTINUOUS call
' and one of the other flags are cleared
ES_CONTINUOUS = &H80000000
End Enum
' Prevents sleep as form loads
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
No_Sleep()
End Sub
' Call API - force no sleep and no display turn off
Private Function No_Sleep() As EXECUTION_STATE
Return SetThreadExecutionState(EXECUTION_STATE.ES_SYSTEM_REQUIRED Or _
EXECUTION_STATE.ES_CONTINUOUS Or EXECUTION_STATE.ES_DISPLAY_REQUIRED)
End Function
API 执行状态(ES_SYSTEM_REQUIRED
、ES_DISPLAY_REQUIRED
和 ES_CONTINUOUS
)在 http://msdn.microsoft.com/en-us/library/windows/desktop/aa373208%28v=vs.85%29.aspx 中有解释。
表单上的一个按钮每五秒闪烁一次红色(用户喜欢知道有什么事情正在发生)。
' Flash button (so users know it's still running)
Private Sub NoSleep_Timer_Tick(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles NoSleep_Timer.Tick
Dim Save_Backcolor As Color = Status_Button.BackColor
Status_Button.BackColor = Color.Red
Me.Update()
Thread.Sleep(500) ' keeps button red for time
Status_Button.BackColor = Save_Backcolor
Me.Update()
End Sub
用户可以双击应用程序将其最小化到系统托盘。最小化时会显示一个气泡提示,以便用户知道使用了哪个图标。
' Minimize to tray if form double clicked
Private Sub Form1_DoubleClick(sender As Object, _
e As System.EventArgs) Handles Me.DoubleClick
MinimizeAppToTray()
End Sub
' hide application form
Private Sub MinimizeAppToTray()
Me.Hide()
NoSleep_NotifyIcon.Visible = True
' Show ballon text for time when app minimized
NoSleep_NotifyIcon.ShowBalloonTip(16000)
End Sub
用户可以双击系统托盘图标再次显示应用程序窗口,或者右键单击图标以关闭应用程序(有关这些功能的完整源代码)。
关注点
这在 Windows XP(32/64 位)、Vista 和 Windows 7 系统上进行了测试,并且可以正常工作。
以下是编译后的应用程序 no_sleep.exe 的校验和(在执行之前**验证**文件完整性,或者重新编译以确保安全)。
MD5 SHA-1
-------------------------------- ----------------------------------------
8397eb0bd800b2ed16dce95c92d2646c 0e679fcb8ef3e34f7528ecb72f963b7d33810a37
历史
- 版本 1 发布于 2011 年 11 月 25 日。
- 版本 2 发布于 2011 年 11 月 27 日(更改了源代码 zip 文件名 - 代码相同)。