2010-01-18 11 views
5

Ho un'applicazione che disabilita temporaneamente lo screen saver per eseguire una presentazione. Io lo uso per accenderlo o spegnerlo:Disabilita e attiva Screen Saver in Windows 7

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

Questo funziona bene in XP. In Windows 7, disattiva correttamente lo screen saver. Tuttavia, quando viene abilitato di nuovo, al momento normale in cui lo screen saver si accende, il sistema richiede una password invece di mostrare lo screen saver.

Da questo momento fino a quando le impostazioni dello screen saver vengono regolate nel pannello di controllo, la schermata della password viene visualizzata al posto dello screen saver.

C'è qualcos'altro che dovrei fare per Windows 7? Comprendo che SPI_GETSCREENSAVEACTIVE non è supportato in Windows 7, ma SPI_SETSCREENSAVEACTIVE dovrebbe essere.

+0

stai eseguendo l'app con privilegi elevati? –

+0

L'utente di Windows 7 è un account amministratore, ma l'app è in esecuzione normalmente. – xpda

+0

Cosa succede se si esegue l'app con autorizzazioni elevate? –

risposta

4

La soluzione è modificare il valore del Registro di sistema HKCU \ Control Panel \ Desktop ScreenSaveActive anziché utilizzare SystemParametersInfo. Funziona sia in XP che in Windows 7.

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

Quello che ho fatto in questa situazione non è di disabilitare lo screensaver, ma di impedire l'avvio dello screensaver. Per fare ciò, periodicamente (su un timer) inviamo un tasto "Left-Shift Up" al sistema operativo.

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 

(io non sono uno sviluppatore vb, ho appena eseguito il codice C# tramite un sistema automatizzato C# -> vb.net convertitore)

Immagino che una combinazione di tasti Maiusc + Su sia la meno probabile per interferire con un'applicazione. Il peggio che può accadere è che, se esattamente nello stesso modo in cui il timer scatta, hai premuto il tasto Maiusc sinistro, causerà la fine del turno.

È possibile, ovviamente, utilizzare qualsiasi altro tasto per impedire l'attivazione dello screen saver.

+0

Perché il downvote? – fre0n

+1

Funzionerebbe, ma causerebbe alcune complicazioni che vorrei evitare. Preferisco imparare come farlo funzionare su Win7 senza eventi periodici. (Non so del downvote.) – xpda

Problemi correlati