5

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

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

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

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

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

4

2 回答 2

5

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

Call Registry.SetValue("HKEY_CURRENT_USER\Control Panel\Desktop", "ScreenSaveActive", "1")
于 2010-01-19T05:08:51.493 回答
4

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

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# 代码)

我认为 Left Shift Up 击键最不可能干扰应用程序。可能发生的最糟糕的情况是,如果在计时器触发的同时,您将左移向下,它将导致移位结束。

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

于 2010-01-18T21:02:20.143 回答