Отключить и включить заставку в Windows 7 - PullRequest
5 голосов
/ 18 января 2010

У меня есть приложение, которое временно отключает экранную заставку для запуска слайд-шоу. Я использую это, чтобы включить или выключить:

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

Это нормально работает в XP. В Windows 7 он правильно отключает заставку. Однако, когда он снова включается, в обычное время для включения заставки система запрашивает пароль вместо отображения заставки.

С этого момента, пока настройки экранной заставки не будут изменены на панели управления, вместо экранной заставки отображается экран пароля.

Есть ли что-то еще, что я должен сделать для Windows 7? Я понимаю, что SPI_GETSCREENSAVEACTIVE не поддерживается в Windows 7, но SPI_SETSCREENSAVEACTIVE должен быть.

Ответы [ 2 ]

5 голосов
/ 19 января 2010

Решение состоит в том, чтобы изменить значение реестра HKCU \ Control Panel \ Desktop ScreenSaveActive key вместо использования SystemParametersInfo.Это работает как в XP, так и в Windows 7.

Call Registry.SetValue("HKEY_CURRENT_USER\Control Panel\Desktop", "ScreenSaveActive", "1")
4 голосов
/ 19 января 2010

В этой ситуации я делал не для того, чтобы отключить заставку, а чтобы она не запускалась. Для этого я периодически (по таймеру) посылаю нажатие клавиши «Влево-вверх» в ОС.

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)

Я полагаю, что нажатие левой клавиши сдвига с наименьшей вероятностью может помешать работе приложения. Худшее, что может случиться, - это то, что, если в тот же момент, когда срабатывает таймер, у вас сдвиг влево, это приведет к завершению сдвига.

Конечно, вы можете использовать любую другую клавишу, чтобы не активировать заставку.

...