代码之家  ›  专栏  ›  技术社区  ›  xpda

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

  •  5
  • xpda  · 技术社区  · 14 年前

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

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

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

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

    我还需要为Windows7做些什么吗?我知道在Windows7中不支持spi_GetScreensaveActive,但应该支持spi_SetScreensaveActive。

    2 回复  |  直到 14 年前
        1
  •  5
  •   xpda    14 年前

    解决方案是更改注册表值hkcu\control panel\desktop screensaveractive key,而不是使用systemparametersinfo。这在XP和Windows7中都有效。

    Call Registry.SetValue("HKEY_CURRENT_USER\Control Panel\Desktop", "ScreenSaveActive", "1")
    
        2
  •  4
  •   fre0n    14 年前

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

    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.NET转换器运行C代码)

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

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