2010-01-18 23 views
5

Tengo una aplicación que deshabilita el protector de pantalla temporalmente para ejecutar una presentación con diapositivas. Lo uso para activarlo o desactivarlo:Deshabilitar y habilitar el protector de pantalla en Windows 7

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

Esto funciona bien en XP. En Windows 7, desactiva el protector de pantalla correctamente. Sin embargo, cuando se habilita de nuevo, en el momento normal para que se active el protector de pantalla, el sistema solicita una contraseña en lugar de mostrar el protector de pantalla.

A partir de este momento hasta que los ajustes del protector de pantalla se ajusten en el panel de control, se mostrará la pantalla de contraseña en lugar del protector de pantalla.

¿Hay algo más que debería hacer para Windows 7? Entiendo que SPI_GETSCREENSAVEACTIVE no es compatible con Windows 7, pero se supone que es SPI_SETSCREENSAVEACTIVE.

+0

¿Está ejecutando la aplicación bajo privilegios elevados? –

+0

El usuario de Windows 7 es una cuenta de administrador, pero la aplicación se ejecuta normalmente. – xpda

+0

¿Qué sucede si ejecuta la aplicación bajo permisos elevados? –

Respuesta

4

La solución es cambiar el valor del registro HKCU \ Control Panel \ Desktop ScreenSaveActive clave en lugar de utilizar SystemParametersInfo. Esto funciona tanto en XP como en Windows 7.

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

Lo que he hecho antes en esta situación no es desactivar el protector de pantalla, sino evitar que se inicie el protector de pantalla. Para hacer esto, periódicamente (en un temporizador) envío una pulsación de tecla "Mayúsculas hacia arriba" 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 

(no soy un desarrollador vb, que acaba de ejecutar el código C# a través de un C# automatizado -> vb.net convertidor)

Me imagino que una pulsación con la tecla Mayúsculas hacia la izquierda es la que menos interfiere con una aplicación. Lo peor que puede pasar es que, si, exactamente al mismo tiempo que el temporizador se dispara, usted tiene el Shift hacia la izquierda, hará que el cambio termine.

Puede, por supuesto, usar cualquier otra tecla para evitar que se active el protector de pantalla.

+0

¿Por qué el voto a favor? – fre0n

+1

Esto funcionaría, pero causaría algunas complicaciones que me gustaría evitar. Prefiero aprender cómo hacerlo funcionar en Win7 sin eventos periódicos. (No sé sobre el voto a favor) – xpda

Cuestiones relacionadas