2009-09-15 25 views

risposta

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(); 
    } 
} 

Questo funziona - unico inconveniente è che u cant interagiscono con il PC per qualcosa come 7 secondi, ma credo che il suo 7 di dare ppl tempo prima di fare screensaver 'permanente'.

+0

La soluzione Grant Wagners avvia lo screensaver e quindi blocca lo schermo, ma il blocco fa uscire lo screensaver. Questa soluzione sta avviando lo screensaver senza bloccarlo esplicitamente, quindi ci vogliono alcuni secondi prima che sia bloccato da Windows. Invertire l'ordine della soluzione di Grant Wagners (chiamando LockWorkStation prima di SendMessage) risolve entrambi i problemi, lo schermo è bloccato immediatamente e lo screensaver viene avviato dopo di esso. – Istador

9

I seguenti requisiti soddisfano le vostre esigenze?

start logon.scr /s 

Finché il .scr si trova sul percorso del comando sopra dovrebbe funzionare.

EDIT: Non so se Windows 7 viene fornito con logon.scr, assicurarsi che si sta testando con un .scr che viene effettivamente installato in Windows 7.

Si noti che ho avuto l'idea di appena invocando la .scr con /s da Screensaver Sample Command Line Options:

Quando Windows viene eseguito il salvaschermo, si lancia con uno dei tre comandi opzioni della riga:

  • /s - Avvia lo screensaver in modalità a schermo intero.
  • /c - Mostra la finestra di dialogo delle impostazioni di configurazione.
  • /p #### - Visualizza un'anteprima dello screensaver utilizzando l'handle di finestra specificato.

EDIT 2:

ho fatto qualche ricerca supplementare e ha scoperto che si potrebbe creare 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" 

Nessuna di queste risposte è perfetto, entrambi rivelano uno sfarfallio del desktop afte Lo screen saver è disabilitato e appena prima che la workstation fosse bloccata.

Potrebbe non essere possibile riprodurre il comportamento del sistema di avvio dello screen saver e protezione della password al ripristino. Anche the answer to Launch System Screensaver from C# Windows Form avvia solo lo screen saver, non protegge con password il curriculum.

+0

non ricordo come funzionasse nelle vecchie finestre ma in 7 mostra solo come sarebbe lo screensaver, ma in realtà non lo accende (Quello che voglio dire è che quando interagisci con il sistema il risparmiatore scompare, quando deve essere visualizzata la schermata di accesso) –

+0

@Grant, ti dispiacerebbe copiare "Modifica 3" in una risposta separata? Mi piacerebbe inversione di tendenza, ma il punto di upvoting è così che la risposta corretta è in cima, e la gente non deve setacciare i tentativi precedenti. :-) –

+0

@system: la soluzione C# è ora una risposta separata. Ho lasciato questa risposta così-è nel caso in cui le soluzioni 'cmd' o' vbs' siano "abbastanza buone" per gli altri che fanno la stessa domanda. –

5

Mettendo insieme the cmd and vbs script ideas con il codice the answer to Launch System Screensaver from C# Windows Form mi si avvicinò con il seguente:

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(); 
    } 
} 

Per costruirla, install the .NET Framework, copia e incolla il codice sopra in lock.cs, quindi eseguire:

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

Inserire il lock.exe creato nel percorso, quindi digitare lock per attivare lo screen saver configurato e bloccare la workstation.

+1

Troppo dolce! Questo funziona perfettamente per me su XP, 2003 e 2008, e non riesco a immaginare nulla che possa fallire su Vista o 7 (anche se non l'ho provato lì). GRAZIE! –

+0

@oO Prendere nota: Windows 7 viene fornito con .NET 3.5 SP1, quindi è possibile saltare il passaggio di installazione, se si tenta di questo. –

+0

@system PAUSE bene, lo fa - dopo aver attivato c'è un blip (screensaver credo) e poi sei reindirizzato allo schermo di accesso. c'è una soluzione - ho postato è una risposta –

0

Sembra strano, che ovunque io abbia guardato non c'è una risposta che rispecchi quella nel O/S stesso. quello che fanno tutti questi hack, è quello di eseguire lo screen saver e poi, una volta arrestato (interrotto), il programma esegue il lock workstation/desktop, dopo il fatto. Lo sforzo senza intoppi di invocare uno screen saver con una protezione con password che, quando viene arrestato/interrotto una password, è necessario per tornare alla workstation è ciò che cerco. Non sembra essere un ordine così alto, vero? Continuerò a cercare qualsiasi tipo di soluzione per il linguaggio di programmazione che possa trovare, ma ovviamente dovevo essere invocato da altre applicazioni a livello di applicazione (comprese le tecnologie di scripting), piuttosto che essere sepolto all'interno del sistema operativo a livello di O/S .

3

ho Windows 7. Ho messo la linea:

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

in un batch (.bat), posizionarlo in una directory appropriata e creare un collegamento che punta a questo, con il tasto di scelta rapida desiderato. In questa riga, \ ExtraPath è il percorso aggiuntivo sotto la directory di vittoria (di solito questo è \ system32) in cui si trovano gli screen saver e ScreenSaverName.scr è il nome dello screen saver desiderato.

Funziona perfettamente.

Ora posso premere i tasti di scelta rapida per eseguire lo screen saver e bloccare il pc.

Grazie mille.

Problemi correlati