在某些情况下,防止计算机进入睡眠状态是必要的。例如,当工作站正在执行第三方模型运行时,如果工作站在运行过程中进入睡眠模式,可能会导致严重的问题。在这种情况下,即使本地电源设置被设置为不休眠,域策略也可能覆盖这些设置,导致工作站仍然会进入睡眠状态。
本文介绍的解决方案是一个使用Visual Basic2010编写的实用工具,它通过调用SetThreadExecutionState API来通知系统工作站正在使用中,从而防止系统进入睡眠状态或关闭显示器。通常情况下,系统会自动检测到本地键盘或鼠标输入、服务器活动以及窗口焦点变化(所有这些活动都会阻止系统进入睡眠状态)。但是,磁盘、CPU活动和视频显示等活动并不会被系统自动检测到(长时间运行的进程也不足以保持系统唤醒)。
该应用程序在窗体加载时调用一次SetThreadExecutionState API。只要这个应用程序在运行,系统就不会进入睡眠状态(或关闭显示器)。
' API调用以防止休眠(直到应用程序退出)
Private Declare Function SetThreadExecutionState Lib "kernel32" _
(
ByVal esFlags As EXECUTION_STATE
) As EXECUTION_STATE
' 定义API执行状态
Private Enum EXECUTION_STATE
' 通过重置显示空闲计时器保持工作状态
ES_SYSTEM_REQUIRED = &H1
' 通过重置系统空闲计时器强制显示开启
ES_DISPLAY_REQUIRED = &H2
' 强制此状态,直到下一次ES_CONTINUOUS调用
' 并且清除其中一个其他标志
ES_CONTINUOUS = &H80000000
End Enum
' 窗体加载时防止休眠
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
No_Sleep()
End Sub
' 调用API - 强制不休眠且不关闭显示器
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)的详细解释可以在找到。
应用程序中有一个按钮,每五秒钟闪烁一次红色(用户喜欢知道有事情在发生)。
' 闪烁按钮(让用户知道它仍在运行)
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)
' 保持按钮红色一段时间
Status_Button.BackColor = Save_BackColor
Me.Update()
End Sub
用户可以通过双击应用程序来将应用程序最小化到系统托盘。当应用程序最小化时,会显示一个气球提示,以便用户知道使用了哪个图标。
' 如果窗体双击,则最小化到托盘
Private Sub Form1_DoubleClick(sender As Object, _
e As System.EventArgs) Handles Me.DoubleClick
MinimizeAppToTray()
End Sub
' 隐藏应用程序窗体
Private Sub MinimizeAppToTray()
Me.Hide()
NoSleep_NotifyIcon.Visible = True
' 显示气球文本一段时间,当应用程序最小化时
NoSleep_NotifyIcon.ShowBalloonTip(16000)
End Sub
用户可以通过双击系统托盘图标来再次显示应用程序窗口,或者右键单击图标来关闭应用程序(有关这些功能的完整源代码,请参见)。
MD5 | 8397eb0bd800b2ed16dce95c92d2646c |
SHA-1 | 0e679fcb8ef3e34f7528ecb72f963b7d33810a37 |