2009-09-15 10 views

Respuesta

2
using System; 
using System.Runtime.InteropServices; 

public static class LockDesktop 
{ 
    [DllImport("user32.dll", EntryPoint = "GetDesktopWindow")] 
    private static extern IntPtr GetDesktopWindow(); 

    [DllImport("user32.dll")] 
    private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam); 

    private const int SC_SCREENSAVE = 0xF140; 
    private const int WM_SYSCOMMAND = 0x0112; 

    public static void SetScreenSaverRunning() 
    { 
     SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, SC_SCREENSAVE, 0); 
    } 

    public static void Main() 
    { 
     LockDesktop.SetScreenSaverRunning(); 
    } 
} 

Esto funciona - único inconveniente es que u no puede interactuar con el PC de forma algo así como 7 segundos, pero supongo que es de 7 para dar PPL tiempo antes de tomar salvapantallas 'permanente'.

+0

La solución de Grant Wagners inicia el protector de pantalla y luego bloquea la pantalla, pero el bloqueo hace que el protector de pantalla salga. Esta solución solo está iniciando el protector de pantalla sin bloquearlo explícitamente, por lo que tarda unos segundos antes de que esté bloqueado por Windows. Invertir el orden de la solución Grant Wagners (llamando a LockWorkStation antes de SendMessage) soluciona ambos problemas, la pantalla se bloquea inmediatamente y el protector de pantalla se inicia después de ella. – Istador

9

¿Los siguientes cumplen con sus requisitos?

start logon.scr /s 

Mientras el .scr está en el camino el comando anterior debería funcionar.

EDIT: No sé si Windows 7 viene con logon.scr, asegúrese de que está probando con un .scr que realmente se instala en Windows 7.

Tenga en cuenta que me dio la idea de invocar el .scr con /s de Screensaver Sample Command Line Options:

Cuando Windows se ejecuta el protector de pantalla, que lanza con una de las tres opciones de línea de comandos :

  • /s - Comience el protector de pantalla en modo de pantalla completa.
  • /c - Muestra el cuadro de diálogo de configuración de configuración.
  • /p #### - Muestra una vista previa del protector de pantalla utilizando el identificador de ventana especificado .

EDIT 2:

que hice algunas búsquedas adicionales y encontró que se podía crear lock.cmd:

@start /wait logon.scr /s & rundll32 user32.dll,LockWorkStation 

O lock.vbs:

Set objShell = CreateObject("Wscript.Shell") 
' The "True" argument will make the script wait for the screensaver to exit 
returnVal = objShell.Run("logon.scr", 1, True) 
' Then call the lock functionality 
objShell.Run "rundll32.exe user32.dll,LockWorkStation" 

Ninguna de estas respuestas es perfecto, ambos revelan un parpadeo del escritorio El protector de pantalla está desactivado y justo antes de que la estación de trabajo esté bloqueada.

Es posible que no se pueda reproducir el comportamiento del sistema al iniciar el protector de pantalla y la protección con contraseña en la reanudación. Incluso the answer to Launch System Screensaver from C# Windows Form solo inicia el protector de pantalla, no protege con contraseña en la reanudación.

+0

No recuerdo cómo funcionaba en las ventanas antiguas, pero en 7 solo muestra cómo se vería ese salvapantallas, pero en realidad no lo enciende (Lo que quiero decir es que cuando interactúas con el sistema, el protector simplemente desaparece cuando se debe mostrar la pantalla de inicio de sesión) –

+0

@Grant, ¿te importaría copiar "Editar 3" en una respuesta separada? Me gustaría subirlo de categoría, pero el objetivo de la votación ascendente es que la respuesta correcta esté en la parte superior, y la gente no tiene que pasar por los intentos anteriores. :-) –

+0

@system: la solución C# ahora es una respuesta separada. Dejé esta respuesta como está, en caso de que las soluciones 'cmd' o' vbs' sean "lo suficientemente buenas" para que otros hagan la misma pregunta. –

5

Juntar the cmd and vbs script ideas con el código de the answer to Launch System Screensaver from C# Windows Form me ocurrió lo siguiente:

using System; 
using System.Runtime.InteropServices; 

public static class LockDesktop 
{ 
    [DllImport("user32.dll", EntryPoint = "GetDesktopWindow")] 
    private static extern IntPtr GetDesktopWindow(); 

    [DllImport("user32.dll")] 
    private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam); 

    [DllImport("user32.dll", EntryPoint = "LockWorkStation")] 
    private static extern IntPtr LockWorkStation(); 

    private const int SC_SCREENSAVE = 0xF140; 
    private const int WM_SYSCOMMAND = 0x0112; 

    public static void SetScreenSaverRunning() 
    { 
     SendMessage(GetDesktopWindow(), WM_SYSCOMMAND, SC_SCREENSAVE, 0); 
     LockWorkStation(); 
    } 

    public static void Main() 
    { 
     LockDesktop.SetScreenSaverRunning(); 
    } 
} 

Para construirlo, install the .NET Framework, copia y pega el código anterior en lock.cs, a continuación, ejecute:

%SystemRoot%\Microsoft.NET\Framework\v3.5\csc.exe lock.cs 

Ponga el lock.exe creado en su camino, después de eso, escribiendo lock debe activar el protector de pantalla configurado y bloquear su estación de trabajo.

+1

¡Demasiado dulce! Esto funciona perfectamente para mí en XP, 2003 y 2008, y no puedo imaginar nada que lo haga fallar en Vista o 7 (aunque no lo he probado allí). ¡GRACIAS! –

+0

@oO Tome nota: Windows 7 se envía con .NET 3.5 SP1, por lo que puede omitir el paso de instalación, si prueba esto. –

+0

@system PAUSE bien, lo hace - después de activar hay un blip (protector de pantalla, supongo) y luego se le redirige a la pantalla de inicio de sesión. hay una solución - lo publique como una respuesta –

0

Parece extraño, que en todas partes que he buscado no hay respuesta que refleje eso en el O/S. Lo que todos estos hacks simplemente hacen es ejecutar el protector de pantalla y luego, cuando se detiene (se interrumpe), el programa ejecuta la estación de trabajo/escritorio de bloqueo, después del hecho. El esfuerzo ininterrumpido para invocar un protector de pantalla con una protección de contraseña que cuando se detiene/interrumpe una contraseña es necesario para volver a la estación de trabajo es lo que estoy buscando. No parece ser una orden tan grande ¿verdad? Continuaré buscando cualquier tipo de solución de lenguaje de programación que pueda encontrar, pero evidentemente necesitaba ser invocado por otras aplicaciones a nivel de aplicación (incluidas las tecnologías de scripting), en lugar de enterrarlo dentro del O/S en el nivel O/S .

3

Tengo Windows 7. He colocado la línea:

@Start/wait% windir% \ ExtraPath \ ScreenSaverName.scr/s & rundll32 user32.dll, LockWorkStation

en un proceso por lotes (.bat), colóquelo en un directorio apropiado y cree un atajo que señale esto, con la tecla de atajo deseada. En esta línea, \ ExtraPath es la ruta adicional debajo de su directorio de Windows (generalmente este es \ system32) donde están ubicados los protectores de pantalla, y ScreenSaverName.scr es el nombre del protector de pantalla deseado.

Funciona perfectamente.

Ahora puedo presionar las teclas de método abreviado para ejecutar el protector de pantalla y bloquear la PC.

Gracias mucho.

Cuestiones relacionadas