65.9K
CodeProject 正在变化。 阅读更多。
Home

让你的电脑患上睡眠呼吸暂停——别让它睡觉

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.74/5 (12投票s)

2011年11月25日

CPOL

2分钟阅读

viewsIcon

39282

downloadIcon

2184

一个实用工具,用于防止工作站进入睡眠状态(在长时间运行的进程期间)。

引言

睡眠呼吸暂停通常不是一件好事,但我需要防止我们的工作站进入睡眠状态。我们的域工作站会在第三方模型运行的中途进入睡眠状态,并且组策略会覆盖任何本地电源设置。

这个解决方案解决了什么问题?

这个 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_REQUIREDES_DISPLAY_REQUIREDES_CONTINUOUS)在 http://msdn.microsoft.com/en-us/library/windows/desktop/aa373208%28v=vs.85%29.aspx 中有解释。

表单上的一个按钮每五秒闪烁一次红色(用户喜欢知道有什么事情正在发生)。

No_Sleep.JPG

' 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

用户可以双击应用程序将其最小化到系统托盘。最小化时会显示一个气泡提示,以便用户知道使用了哪个图标。

No_Sleep_NotifyIcon.JPG

' 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 文件名 - 代码相同)。
© . All rights reserved.