在Windows 7中禁用并启用屏幕保护程序

时间:2010-01-18 17:54:32

标签: .net vb.net winforms windows-7 screensaver

我有一个应用程序而不是暂时禁用屏幕保护程序以运行幻灯片放映。我用它打开或关闭它:

i = SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, active, Nothing, SPIF_SENDWININICHANGE)

这在XP中运行良好。在Windows 7中,它会正确禁用屏幕保护程序。但是,当再次启用时,屏幕保护程序正常运行时,系统会要求输入密码而不是显示屏幕保护程序。

从此时开始,直到在控制面板中调整屏幕保护程序设置,将显示密码屏幕以代替屏幕保护程序。

我还应该为Windows 7做些什么吗?我知道Windows 7不支持SPI_GETSCREENSAVEACTIVE,但SPI_SETSCREENSAVEACTIVE应该是。

2 个答案:

答案 0 :(得分:5)

解决方案是更改注册表值HKCU \ Control Panel \ Desktop ScreenSaveActive键而不是使用SystemParametersInfo。这适用于XP和Windows 7。

Call Registry.SetValue("HKEY_CURRENT_USER\Control Panel\Desktop", "ScreenSaveActive", "1")

答案 1 :(得分:4)

在此情况下我之前所做的不是禁用屏幕保护程序,而是阻止屏幕保护程序启动。为此,我定期(在计时器上)向操作系统发送“左移”按键。

C#:

[DllImport("user32")]
private static extern void keybd_event(byte bVirtualKey, byte bScanCode, int dwFlags, int dwExtraInfo);

private const byte VK_LSHIFT = 0xA0;
private const int KEYEVENTF_KEYUP = 0x0002;

// When the timer elapses, send Left Shift Up
private void timer1_Tick(object sender, EventArgs e)
{
    keybd_event(VK_LSHIFT, 0x45, KEYEVENTF_KEYUP, 0);
}

vb.net:

Private Const VK_LSHIFT As Byte = 160

Private Const KEYEVENTF_KEYUP As Integer = 2

Private Declare Sub keybd_event Lib "user32" (ByVal bVirtualKey As Byte, ByVal bScanCode As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)

' When the timer elapses, send Left Shift Up
Private Sub timer1_Tick(ByVal sender As Object, ByVal e As EventArgs)
    keybd_event(VK_LSHIFT, 69, KEYEVENTF_KEYUP, 0)
End Sub

(我不是vb开发人员,我只是通过自动c# - > vb.net转换器运行c#代码)

我认为左移键击最不可能干扰应用程序。可能发生的最坏情况是,如果与计时器触发的完全相同,则左移向下,将导致移位结束。

当然,您可以使用任何其他密钥来阻止屏幕保护程序激活。