2009-09-15 11 views

ответ

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

Это работает - Единственный недостаток является то, что и не может взаимодействовать с ПК на что-то вроде 7 секунд, но я предполагаю, что его 7-х, чтобы дать время Закона о госзакупках, прежде чем сделать заставку «постоянным».

+0

Решение Grant Wagners запускает скринсейвер, а затем блокирует экран, но блокировка заставляет экранную заставку покидать экран. Это решение просто запускает скринсейвер, не закрывая его, поэтому требуется несколько секунд, прежде чем он будет заблокирован окнами. Реверсирование решения Grant Wagners (вызов LockWorkStation перед SendMessage) устраняет обе проблемы, экран блокируется немедленно, и заставка запускается после него. – Istador

2

Вы можете попробовать Powershell Script To Start A Random Screen Saver.

+0

, что означало бы загрузку дополнительного программного обеспечения - я этого не хочу. –

+0

@oO: Powershell ** уже установлен ** на окнах 7. – surfasb

9

Соответствует ли следующее требованиям?

start logon.scr /s 

Пока .scr находится на пути выше команда должна работать.

EDIT: Я не знаю, если Windows 7 поставляется с logon.scr, убедитесь, что вы проверяете его с .scr, что на самом деле установлен в ОС Windows 7.

Обратите внимание, что я получил представление о том, ссылаясь на .scr с /s из Screensaver Sample Command Line Options:

Когда Windows запускает заставку, она запускает его с одним из трех команд вариантов строки:

  • /s - Запустите скринсейвер в полноэкранном режиме.
  • /c - Показать диалоговое окно параметров конфигурации.
  • /p #### - Отобразить предварительный просмотр заставки с использованием указанного оконного дескриптора .

EDIT 2:

Я сделал некоторые дополнительные поиски и обнаружили, что можно создать lock.cmd:

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

Или 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" 

Ни один из этих ответов идеально, оба показывают мерцание рабочего стола afte r экранная заставка отключена и непосредственно перед блокировкой рабочей станции.

Возможно, не удастся воспроизвести системное поведение запуска экранной заставки и защиты паролем при возобновлении. Даже the answer to Launch System Screensaver from C# Windows Form запускает экранную заставку, при возобновлении он не защищает паролем.

+0

Я не помню, как это работало в старых версиях, но в 7 оно просто показывает, как будет выглядеть этот скринсейвер, но на самом деле он не включается (что я имею в виду, когда u взаимодействует с системой, заставка просто исчезает, когда должен отображаться экран входа в систему) –

+0

@Grant, Не могли бы вы скопировать «Редактировать 3» в отдельный ответ? Я бы хотел, чтобы его поддержали, но вопрос о повышении - это правильный ответ, и люди не должны просеивать предыдущие попытки. :-) –

+0

@system: решение C# теперь является отдельным ответом. Я оставил этот ответ как есть, если решения 'cmd' или' vbs' «достаточно хороши» для других, задающих тот же вопрос. –

5

Собирая the cmd and vbs script ideas с кодом из the answer to Launch System Screensaver from C# Windows Form я придумал следующее:

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

Чтобы построить его, install the .NET Framework, скопируйте и вставьте приведенный выше код в lock.cs, а затем запустить:

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

Поместите созданный lock.exe в свой путь, после чего набрав lock, необходимо задействовать настроенную заставку и заблокировать рабочую станцию.

+1

Слишком сладкий! Это отлично работает для меня в XP, 2003 и 2008 годах, и я не могу представить ничего, что могло бы привести к сбою в Vista или 7 (хотя я там не пробовал). БЛАГОДАРЯ! –

+0

@oO Обратите внимание: Windows 7 поставляется с .NET 3.5 SP1, поэтому вы можете пропустить шаг установки, если попробуете это. –

+0

@system ПАУЗА хорошо, он делает - после активации есть клип (скринсейвер, я думаю), а затем u перенаправляются на экран входа в систему. есть исправление для него - я опубликовал это как ответ –

0

Кажется странным, что везде, где я смотрел, нет ответа, который отражает это в самой O/S. что все эти хаки просто делают, - это запустить экранную заставку, а затем, когда она остановлена ​​(прервана), программа запускает рабочую станцию ​​/ рабочий стол блокировки после факта. Непрерывное усилие, чтобы вызвать экранную заставку с защитой паролем, которая при остановке/прерывании пароля требуется для возврата на рабочую станцию, - это то, что мне нужно. Кажется, это не такой высокий порядок? Я буду искать любое решение для программирования, которое я могу найти, но, очевидно, ему нужно было вызывать другие приложения на уровне приложений (включая технологии создания сценариев), а не быть похороненными в пределах O/S на уровне O/S ,

3

У меня Windows 7 я поместил строку:

@start/ожидание% WINDIR% \ ExtraPath \ ScreenSaverName.scr/s & rundll32 user32.dll, LockWorkStation

в партии (.bat), поместите его в соответствующий каталог и создайте ярлык, указывающий на это, с помощью желаемой клавиши быстрого доступа. В этой строке \ ExtraPath - это дополнительный путь под вашим win dir (обычно это \ system32), где находятся хранители экрана, а ScreenSaverName.scr - это имя желаемой экранной заставки.

Он отлично работает.

Теперь я могу нажать клавиши быстрого доступа, чтобы запустить экранную заставку и заблокировать компьютер.

Спасибо, что очень много.