У меня есть приложение, чем отключает экранную заставку временно для выполнения показа слайдов. Я использую это для включения или выключения его:
i = SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, active, Nothing, SPIF_SENDWININICHANGE)
Это хорошо работает в XP. В Windows 7 это отключает экранную заставку правильно. Однако, когда это позволено снова в нормальное время для экранной заставки продвинуться, система просит пароль вместо того, чтобы показать экранную заставку.
С этого времени на, пока настройки экранной заставки не корректируются в панели управления, экран пароля отображен вместо экранной заставки.
Есть ли что-то еще, что я должен делать для Windows 7? Я понимаю, что SPI_GETSCREENSAVEACTIVE не поддерживается в Windows 7, но SPI_SETSCREENSAVEACTIVE, как предполагается.
Решение состоит в том, чтобы изменить значение реестра HKCU \ Control \ Desktop ScreensaveActive key вместо использования 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 Converter)
Я полагаю, что левый сдвиг Up keystroke - наименее вероятность вмешиваться в приложение. Худшее, что может произойти, это то, что если, точно так же, что таймер пожали, у вас есть левый сдвиг вниз, он приведет к концу сдвига.
Вы можете, конечно, использовать любой другой ключ, чтобы сохранить задержку с активацией.