2010-01-18 2 views
5

J'ai une application qui désactive temporairement l'économiseur d'écran afin de lancer un diaporama. Je l'utilise pour l'allumer ou l'éteindre:Désactiver et activer l'économiseur d'écran dans Windows 7

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

Cela fonctionne très bien sous XP. Dans Windows 7, il désactive correctement l'économiseur d'écran. Cependant, lorsqu'il est de nouveau activé, à l'heure normale où l'économiseur d'écran s'allume, le système demande un mot de passe au lieu d'afficher l'économiseur d'écran.

À partir de ce moment, jusqu'à ce que les paramètres de l'économiseur d'écran soient réglés sur le panneau de commande, l'écran de mot de passe s'affiche à la place de l'économiseur d'écran.

Y a-t-il autre chose que je devrais faire pour Windows 7? Je comprends que SPI_GETSCREENSAVEACTIVE n'est pas pris en charge dans Windows 7, mais que SPI_SETSCREENSAVEACTIVE est censé l'être.

+0

exécutez-vous l'application sous des privilèges élevés? –

+0

L'utilisateur Windows 7 est un compte administrateur, mais l'application fonctionne normalement. – xpda

+0

Que se passe-t-il si vous exécutez l'application avec des autorisations élevées? –

Répondre

4

La solution consiste à modifier la valeur de registre HKCU \ Control Panel \ Desktop ScreenSaveActive au lieu d'utiliser SystemParametersInfo. Cela fonctionne dans XP et Windows 7.

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

Ce que j'ai fait auparavant dans cette situation n'est pas de désactiver l'économiseur d'écran, mais d'empêcher le démarrage de l'économiseur d'écran. Pour ce faire, je envoie périodiquement (sur une minuterie) une touche "Left-Shift Up" sur le système d'exploitation.

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 

(Je ne suis pas un développeur vb, je viens de rencontrer le code C# par un système automatisé C# -> vb.net convertisseur)

Je me suis dit qu'une frappe de touche gauche vers le haut est la moins susceptible d'interférer avec une application. Le pire qui puisse arriver est que, si exactement au même moment que la minuterie se déclenche, le décalage vers la gauche est abaissé, cela entraînera la fin du décalage.

Vous pouvez, bien sûr, utiliser n'importe quelle autre touche pour empêcher l'activation de l'économiseur d'écran.

+0

Pourquoi la downvote? – fre0n

+1

Cela fonctionnerait, mais cela causerait certaines complications que j'aimerais éviter. Je préfère apprendre à le faire fonctionner dans Win7 sans événements périodiques. (Je ne sais pas à propos de la downvote.) – xpda

Questions connexes