2010-01-18 69 views
5

Mam aplikację tymczasowo niż wyłącza wygaszacz ekranu, aby uruchomić pokaz slajdów. Używam tego, aby włączyć lub wyłączyć:Wyłączanie i włączanie wygaszacza ekranu w systemie Windows 7

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

To działa dobrze w XP. W systemie Windows 7 wyłącza wygaszacz ekranu. Jednak po ponownym uruchomieniu, w normalnym czasie, po włączeniu wygaszacza ekranu, system poprosi o hasło zamiast pokazywania wygaszacza ekranu.

Od tego czasu, aż ustawienia ekranu zostaną zmienione w panelu sterowania, zamiast ekranu zostanie wyświetlony ekran hasła.

Czy jest coś jeszcze, co powinienem robić dla Windows 7? Rozumiem, że SPI_GETSCREENSAVEACTIVE nie jest obsługiwany w systemie Windows 7, ale ma być SPI_SETSCREENSAVEACTIVE.

+0

czy używasz aplikacji z podwyższonymi uprawnieniami? –

+0

Użytkownik systemu Windows 7 jest kontem administracyjnym, ale aplikacja działa normalnie. – xpda

+0

Co się stanie, jeśli uruchomisz aplikację z podwyższonymi uprawnieniami? –

Odpowiedz

4

Rozwiązaniem jest zmiana wartości rejestru HKCU \ Control Panel \ Desktop ScreenSaveActive zamiast przy użyciu SystemParametersInfo. Działa to zarówno w XP, jak i Windows 7.

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

To, co wcześniej robiłem w tej sytuacji, to nie wyłączać wygaszacza ekranu, ale zapobiegać uruchamianiu wygaszacza ekranu. Aby to zrobić, okresowo (na czasomierzu) wysyłam skrót klawiszowy "Left-Shift Up" do systemu operacyjnego.

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 

(nie jestem programista VB, po prostu prowadził kod C# za pomocą zautomatyzowanego C# -> vb.net konwertera)

Uważam, że naciśnięcie klawisza w lewo w górę powoduje najmniejsze zakłócenie działania aplikacji. Najgorsze, co może się zdarzyć, to to, że jeśli uruchomi się timer, przesunięcie w lewo spowoduje przesunięcie.

Można oczywiście użyć dowolnego innego klucza, aby wygaszacz ekranu nie aktywował się.

+0

Dlaczego upadek? – fre0n

+1

To zadziała, ale spowoduje pewne komplikacje, których chciałbym uniknąć. Wolę nauczyć się, jak sprawić, by działało w Win7 bez okresowych zdarzeń. (Nie wiem, co się stało.) – xpda

Powiązane problemy