VB中如何禁用屏幕保护

36次阅读
没有评论

最近朋友找我做个小项目,查询机,考虑到需要禁止自动屏保和电源管理,VB6+WINXP测试通过!

新建VB默认工程,把如下代码复制进VB的代码窗口,生成就可以了:

Option Explicit
Private Const SPI_SETSCREENSAVEACTIVE = 17
Private Const SPI_SETSCREENSAVETIMEOUT = 15
Private Const SPIF_SENDWININICHANGE = &H2
Private Const SPIF_UPDATEINIFILE = &H1
Private Declare Function SystemParametersInfo Lib “user32” Alias “SystemParametersInfoA” (ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Long, ByVal fuWinIni As Long) As Long

Private Sub Form_Load()
Call SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, 0, SPIF_UPDATEINIFILE + SPIF_SENDWININICHANGE)
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Call SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, 0, SPIF_UPDATEINIFILE + SPIF_SENDWININICHANGE)
End Sub

关于禁用屏幕保护和电源管理C代码为VB语言

原文

[推荐]关于禁用屏幕保护和电源管理<--StartFragment --> 编写诸如监控、多媒体、大规模数据处理之类程序的时候,我们常常需要禁用屏幕保护和电源管理,以确保程序的正常运行。一般来说,可以使用模拟鼠标键盘动作的办法禁用95下的屏幕保护和电源管理,但是同样的方法应用到2000/NT,却常常会无效,这和系统的设置有关系。

运用Windows平台SDK的界面API可以轻松的做到禁用屏幕保护和电源管理,唯一的缺陷是这种方法无法应用到Windows95下的Win32应用程序中。以下,我将介绍具体方法。

使用SystemParametersInfo这个API来实现对屏幕保护和电源管理的禁用:

BOOL SystemParametersInfo(

UINT uiAction, // system parameter to retrieve or set

UINT uiParam, // depends on action to be taken

PVOID pvParam, // depends on action to be taken

UINT fWinIni // user profile update option

);

以下是禁用屏幕保护的代码:

void DisableScrSaver()

{

BOOL bScrActive;

SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &bScrActive, 0);

if (bScrActive)

{

SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0);

}

}

以下是启用屏幕保护的代码:

void CNetRGCltDlg::EnableScrSaver()

{

SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0);

}

由于禁用电源保护不可以在Win95下被Win32应用程序使用,所以要事先判断当前操作系统是不是Win95,这里假设已经用函数BOOL IsWin95()实现。

以下是禁用电源保护的代码:

void DisablePmmSaver()

{

//

// 由于电源管理的特殊性,不能直接用SPI_SETLOWPOWERACTIVE命令字实现,而是要设置延时。

//

SystemParametersInfo(SPI_GETLOWPOWERTIMEOUT, 0, &m_nLowpowerTimeout, 0);

SystemParametersInfo(SPI_GETPOWEROFFTIMEOUT, 0, &m_nPoweroffTimeout, 0);

SystemParametersInfo(SPI_SETLOWPOWERTIMEOUT, 0, NULL, 0);

SystemParametersInfo(SPI_SETPOWEROFFTIMEOUT, 0, NULL, 0);

}

以下是启用电源保护的代码

void EnablePmmSaver()

{

SystemParametersInfo(SPI_SETLOWPOWERTIMEOUT, m_nLowpowerTimeout, NULL, 0);

SystemParametersInfo(SPI_SETPOWEROFFTIMEOUT, m_nPoweroffTimeout, NULL, 0);

m_nLowpowerTimeout = 0;

m_nPoweroffTimeout = 0;

}

说明:

1 m_nLowpowerTimeout和m_nPoweroffTimeout是用来存储原先延时的变量,当恢复电源保护时要把电源保护延时设置回原来的值;

2 上面的代码仅仅为了说明调用序列,实际应用时还要加上相当多的错误处理代码,这里忽略。

编写诸如监控、多媒体、大规模数据处理之类程序的时候,我们常常需要禁用屏幕保护和电源管理,以确保程序的正常运行。一般来说,可以使用模拟鼠标键盘动作的办法禁用95下的屏幕保护和电源管理,但是同样的方法应用到2000/NT,却常常会无效,这和系统的设置有关系。

运用Windows平台SDK的界面API可以轻松的做到禁用屏幕保护和电源管理,唯一的缺陷是这种方法无法应用到Windows95下的Win32应用程序中。以下,我将介绍具体方法。

转为VB如下

窗体中加入两个按钮

然后写代码

Option Explicit

Dim m_nLowpowerTimeout As Long
Dim M_nPoweroffTimeout 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

Private Const SPI_GETLOWPOWERTIMEOUT = 79
Private Const SPI_SETPOWEROFFTIMEOUT = 82
Private Const SPI_GETPOWEROFFTIMEOUT = 80
Private Const SPI_SETLOWPOWERTIMEOUT = 81

Private Sub Command1_Click()

Call SystemParametersInfo(SPI_GETLOWPOWERTIMEOUT, 0, m_nLowpowerTimeout, 0)

Call SystemParametersInfo(SPI_GETPOWEROFFTIMEOUT, 0, M_nPoweroffTimeout, 0)

Call SystemParametersInfo(SPI_SETLOWPOWERTIMEOUT, 0, Null, 0)

Call SystemParametersInfo(SPI_SETPOWEROFFTIMEOUT, 0, Null, 0)

End Sub

Private Sub Command2_Click()

Call SystemParametersInfo(SPI_SETLOWPOWERTIMEOUT, m_nLowpowerTimeout, Null, 0)

Call SystemParametersInfo(SPI_SETPOWEROFFTIMEOUT, M_nPoweroffTimeout, Null, 0)

m_nLowpowerTimeout = 0
M_nPoweroffTimeout = 0

End Sub

方法2

这个不同上面一个,添加一个窗体,加入一个Timer控件,调用时间设置10秒左右都可

Option Explicit

Const ES_SYSTEM_REQUIRED = &H1
Const ES_DISPLAY_REQUIRED = &H2

Private Declare Function SetThreadExecutionState Lib “Kernel32” (ByVal esFlag As Long) As Long

Private Sub Timer1_Timer() ‘必须定时调用

Call SetThreadExecutionState(ES_DISPLAY_REQUIRED) ‘显示器节能

Call SetThreadExecutionState(ES_SYSTEM_REQUIRED) ‘系统硬盘等节能

Label1 = “已开启”

End Sub

正文完