2009-09-15 11 views

Odpowiedz

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

To działa - Jedynym minusem jest to, że u cant interakcji z komputerem za coś podobnego 7 sekund, ale sądzę, że jego 7, aby dać czas ppl przed dokonaniem wygaszacza ekranu „stałe”.

+0

Rozwiązanie Granta Wagnersa uruchamia wygaszacz ekranu, a następnie blokuje ekran, ale blokada powoduje wygaszanie wygaszacza ekranu. To rozwiązanie uruchamia tylko wygaszacz ekranu bez wyraźnego blokowania go, więc może minąć kilka sekund, zanim zostanie zablokowany przez okna. Odwrócenie kolejności rozwiązania Grant Wagners (wywoływanie LockWorkStation przed SendMessage) rozwiązuje oba problemy, ekran jest natychmiast blokowany, a wygaszacz ekranu jest uruchamiany po tym. – Istador

9

Czy spełniasz następujące wymagania?

start logon.scr /s 

Dopóki .scr jest na ścieżce powyższe polecenie powinno działać.

EDIT: Nie wiem, czy Windows 7 jest wyposażony logon.scr, upewnij się, że testujemy go z .scr która jest faktycznie zainstalowanej w systemie Windows 7.

Zauważ, że mam pomysł tylko wywoływanie .scr z /s z Screensaver Sample Command Line Options:

Gdy system Windows działa wygaszacz ekranu, to uruchamia go z jednej z trzech opcji wiersza poleceń :

  • /s - Uruchom wygaszacz ekranu w trybie pełnoekranowym.
  • /c - Pokaż okno dialogowe ustawień konfiguracyjnych.
  • /p #### - Wyświetl podgląd wygaszacza ekranu za pomocą określonego uchwytu okna .

EDIT 2:

zrobiłem kilka dodatkowych poszukiwania i okazało się, że można utworzyć lock.cmd:

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

Or 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" 

Żadna z tych odpowiedzi jest idealnie, obie odsłaniają migotanie pulpitu r wygaszacz ekranu jest wyłączony i tuż przed zablokowaniem stacji roboczej.

Może nie być możliwe odtworzenie zachowania systemu podczas uruchamiania wygaszacza ekranu i hasła chroniącego przed wznowieniem. Nawet the answer to Launch System Screensaver from C# Windows Form uruchamia tylko wygaszacz ekranu, nie chroni hasłem przy wznowieniu.

+0

Nie pamiętam, jak to działało w starszych oknach, ale w 7 po prostu pokazuje, jak ten wygaszacz ekranu wyglądałby, ale tak naprawdę go nie włącza (co mam na myśli, gdy wchodzisz w interakcję z systemem, wygaszacz po prostu znika, kiedy powinien być wyświetlany ekran logowania) –

+0

@Grant, Czy mógłbyś skopiować "Edit 3" do oddzielnej odpowiedzi? Chciałbym go przegłosować, ale kwestią podniesienia jest to, że poprawna odpowiedź jest na wierzchu, a ludzie nie muszą przesiewać wcześniejszych prób. :-) –

+0

@system: Rozwiązanie C# jest teraz oddzielną odpowiedzią. Pozostawiłem tę odpowiedź tak, jak w przypadku, gdy rozwiązania "cmd" lub "vbs" są "wystarczająco dobre" dla innych, zadających to samo pytanie. –

5

Zestawiając the cmd and vbs script ideas z kodem z the answer to Launch System Screensaver from C# Windows Form wymyśliłem następujące:

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

ją zbudować, install the .NET Framework, skopiuj i wklej powyższy kod na lock.cs, a następnie uruchomić:

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

Umieść utworzoną lock.exe na swojej ścieżce, po czym wpisanie lock powinno włączyć skonfigurowany wygaszacz ekranu i zablokować stację roboczą.

+1

Zbyt słodkie! Działa to doskonale dla mnie na XP, 2003 i 2008, i nie mogę wyobrazić sobie niczego, co sprawiłoby, że to zawiedzie w Vista lub 7 (chociaż nie próbowałem tam tego). DZIĘKI! –

+0

@o Zrób notatkę: Windows 7 jest dostarczany z .NET 3.5 SP1, więc możesz pominąć krok instalacji, jeśli spróbujesz tego. –

+0

@system PAUSE dobrze, robi - po aktywacji jest blip (chyba wygaszacz ekranu), a następnie przekierowujesz na ekran logowania. jest na to poprawka - wysłałem odpowiedź jako odpowiedź –

0

Wydaje się dziwne, że wszędzie, gdzie patrzyłem, nie ma odpowiedzi, która odzwierciedla to samo w O/S. co wszystkie te hacki robią, to uruchomić wygaszacz ekranu, a po zatrzymaniu (przerwaniu) program uruchamia blokadę/pulpit po fakcie. Bezproblemowa próba wywołania wygaszacza ekranu z ochroną hasłem, która po zatrzymaniu/przerwaniu hasła jest wymagana, aby powrócić na stację roboczą, jest to, o co prosiłem. Czy nie wydaje ci się, że jest to tak wysokie zamówienie? Będę szukał dowolnego rozwiązania języka programowania, które będę mógł znaleźć, ale oczywiście trzeba go wywołać przez inne aplikacje na poziomie aplikacji (włączając w to technologie skryptowe), zamiast pochować je w O/S na poziomie O/S .

3

mam system Windows 7. I umieścił wiersz:

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

w partii (.bat), umieść go w odpowiednim katalogu i utwórz skrót wskazujący na to, używając żądanego klawisza skrótu. W tym wierszu \ ExtraPath jest dodatkową ścieżką pod katalogiem win (zazwyczaj jest to \ system32), w którym znajdują się wygaszacze ekranu, a ScreenSaverName.scr to nazwa żądanego wygaszacza ekranu.

Działa doskonale.

Teraz mogę nacisnąć klawisze skrótu, aby uruchomić wygaszacz ekranu i zablokować komputer.

Bardzo dziękuję.

Powiązane problemy