主题:播放器中更改及恢复电源使用方案的代码
自编的播放器在播放视频时,都会遇到两个问题:一个是电源使用方案中关闭监视器和硬盘的时间问题,一个是屏保开启的问题,这两个问题都需要你在播放视频时不时地移动一下鼠标,很烦人。当然啰,你可以将自己电脑的电源使用方案设置为“从不”,并且关闭屏保,但如果你的播放器准备发布给大家使用,那就必须妥善解决这两个问题。
我的解决办法是:在播放器中的代码中,当需要播放视频时,把电源使用方案中的三个项目(关闭监视器时间、关闭硬盘时间、系统待机时)都设置为“从不”,并关闭屏保。当视频播放完毕时,再恢复原来的设置。
关闭屏保容易解决,调用一个API函数就行了,修改电源方案则遇到了一点麻烦。开始我在代码中使用修改注册表的办法,没有成功,后来只得使用了一个DOS命令“POWERCFG”,终于成功了!现将代码与大家共享。
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long
Dim SchemeFile As String '电源方案文件
Dim SchemeName As String '电源方案名称
Dim monitor_timeout As Long '关闭监视器时间
Dim disk_timeout As Long '关闭硬盘时间
Dim standby_timeout As Long '系统待机时间
Dim BjScheme As Boolean '电源方案更改标记
Private Sub 改变电源方案()
If Not BjScheme Then
On Error GoTo 100
Dim st As String
SchemeFile = Environ("TEMP") & "\电源使用方案.txt"
Shell "cmd /c POWERCFG /QUERY > " & SchemeFile '导出原电源方案的配置
Do '等待生成电源方案文件
DoEvents
Sleep 200
Loop Until Len(Dir(SchemeFile))
Open SchemeFile For Input As #1
Do Until EOF(1)
Line Input #1, st
If InStr(st, "名称") Then SchemeName = Trim(Mid(st, 20))
If InStr(st, "关闭监视器(AC)") Then monitor_timeout = Val(Mid(st, 20))
If InStr(st, "关闭硬盘(AC)") Then disk_timeout = Val(Mid(st, 20))
If InStr(st, "系统待机(AC)") Then standby_timeout = Val(Mid(st, 20)): Exit Do
Loop
Shell "cmd /c POWERCFG /CHANGE " & SchemeName & " /monitor-timeout-ac 0" '关闭监视器时间改为“从不”
Shell "cmd /c POWERCFG /CHANGE " & SchemeName & " /disk-timeout-ac 0" '关闭磁盘时间改为“从不”
Shell "cmd /c POWERCFG /CHANGE " & SchemeName & " /standby-timeout-ac 0" '系统待机时间改为“从不”
BjScheme = True
100
Close
End If
SystemParametersInfo 17, False, 0, 0 '关闭屏保
End Sub
Private Sub 恢复电源方案()
If BjScheme Then
Shell "cmd /c POWERCFG /CHANGE " & SchemeName & " /monitor-timeout-ac " & monitor_timeout '复原关闭监视器时间
Shell "cmd /c POWERCFG /CHANGE " & SchemeName & " /disk-timeout-ac " & disk_timeout '复原关闭磁盘时间
Shell "cmd /c POWERCFG /CHANGE " & SchemeName & " /standby-timeout-ac " & standby_timeout '复原系统待机时间
Kill SchemeFile
BjScheme = False
End If
SystemParametersInfo 17, True, 0, 0 '恢复屏保
End Sub
在“改变电源方案”过程中,注意“等待生成电源方案文件”的那个 DO 循环,之所以要增加这么一个空循环,是因为 Shell 命令执行后,只要没有语法错误,它不等执行结果出来,就会越过去把执行权交给下一个语句或命令,这就会造成“导出原电源方案的配置”文件还未生成,而紧接着下一句又要打开这个配置文件,必定出错,为了防止这种情况发生,所以要增加一个空循环,让系统生成配置文件后再往下执行。