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

5

我有一个应用程序,它可以暂时禁用屏幕保护以运行幻灯片。 我使用以下代码来打开或关闭它:

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

在XP系统中,此功能正常工作。在Windows 7中,它可以正确地禁用屏幕保护程序。然而,当再次启用时,在屏幕保护程序正常启动的时间,系统要求输入密码而不是显示屏幕保护程序。
从此时起直到在控制面板中调整屏幕保护设置之前,密码屏幕将显示在屏幕保护程序的位置。
在Windows 7中是否应该做些其他事情?我知道SPI_GETSCREENSAVEACTIVE在Windows 7中不被支持,但据说SPI_SETSCREENSAVEACTIVE是被支持的。

你是否在提升的权限下运行应用程序? - Russ Bradberry
Windows 7 用户是管理员账户,但应用程序正常运行。 - xpda
如果您在提升的权限下运行应用程序会发生什么? - Russ Bradberry
当以管理员身份运行应用程序时,不会发生任何更改。我可能会补充说明,当这种情况发生时,它是一个“永久”的设置。也就是说,从此时起直到在控制面板中调整屏幕保护程序设置之前,密码屏幕将显示而不是屏幕保护程序。 - xpda
2个回答

5
解决方法是更改注册表值HKCU\Control Panel\Desktop ScreenSaveActive键,而不是使用SystemParametersInfo。这适用于XP和Windows 7。
Call Registry.SetValue("HKEY_CURRENT_USER\Control Panel\Desktop", "ScreenSaveActive", "1")

4

在这种情况下,我以前所做的不是禁用屏幕保护程序,而是防止屏幕保护程序启动。为此,我会定时(使用计时器)向操作系统发送“左Shift松开”按键。

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

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

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


1
这样做是可行的,但会引起一些麻烦,我希望避免。我更喜欢学习如何在Win7中使其工作,而不需要周期性事件。(不知道关于负投票的事情。) - xpda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接