【问题标题】:Disable and Enable Screen Saver in Windows 7在 Windows 7 中禁用和启用屏幕保护程序
【发布时间】:2024-05-18 12:05:02
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您是否在提升的权限下运行应用程序?
  • Windows 7用户是管理员帐号,但应用运行正常。
  • 如果您在提升的权限下运行应用程序会发生什么?
  • 应用以管理员身份运行时没有变化。我可能会补充说,当这种情况发生时,它是一个“永久”设置。也就是说,从此时开始,直到在控制面板中调整屏幕保护程序设置为止,将显示密码屏幕而不是屏幕保护程序。

标签: .net vb.net winforms windows-7 screensaver


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我之前在这种情况下所做的不是禁用屏幕保护程序,而是阻止屏幕保护程序启动。为此,我会定期(在计时器上)向操作系统发送“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 击键最不可能干扰应用程序。可能发生的最糟糕的情况是,如果在计时器触发的同时,您按下左移键,则会导致移位结束。

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

    【讨论】:

    • 这会起作用,但它会导致一些我想避免的并发症。我更喜欢学习如何让它在没有周期性事件的情况下在 Win7 中工作。 (不知道否决票。)
    最近更新 更多