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

问题描述:

我有一个应用程序暂时禁用屏幕保护程序,以便运行幻灯片放映。我用它打开或关闭:在Windows 7中禁用并启用屏幕保护程序

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

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

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

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

+0

你是否在提升的权限下运行应用程序? – 2010-01-18 18:17:09

+0

Windows 7用户是管理员帐户,但该应用程序正常运行。 – xpda 2010-01-18 18:41:10

+0

如果您在提升的权限下运行应用程序,会发生什么情况? – 2010-01-18 19:03:26

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

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

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

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#,C#代码 - > vb.net转换器)

我认为向左移动按键最不可能干扰应用程序。可能发生的最糟糕的情况是,如果与定时器触发完全相同,则您将左移下移,这将导致转换结束。

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

+0

为什么downvote? – fre0n 2010-01-18 21:19:12

+1

这会起作用,但会造成一些我想避免的复杂情况。我更喜欢学习如何在没有定期事件的情况下在Win7中工作。 (不知道downvote。) – xpda 2010-01-18 22:09:41