我有一个应用程序而不是暂时禁用屏幕保护程序以运行幻灯片放映。我用它打开或关闭它:
i = SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, active, Nothing, SPIF_SENDWININICHANGE)
这在XP中运行良好。在Windows 7中,它会正确禁用屏幕保护程序。但是,当再次启用时,屏幕保护程序正常运行时,系统会要求输入密码而不是显示屏幕保护程序。
从此时开始,直到在控制面板中调整屏幕保护程序设置,将显示密码屏幕以代替屏幕保护程序。
我还应该为Windows 7做些什么吗?我知道Windows 7不支持SPI_GETSCREENSAVEACTIVE,但SPI_SETSCREENSAVEACTIVE应该是。
答案 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#代码)
我认为左移键击最不可能干扰应用程序。可能发生的最坏情况是,如果与计时器触发的完全相同,则左移向下,将导致移位结束。
当然,您可以使用任何其他密钥来阻止屏幕保护程序激活。