Как включить экранную заставку (окна 7) кодом (в cmd)? [закрытый]

Можно сделать это с некоторым кодом interop:

    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
    [return: MarshalAsAttribute(UnmanagedType.Bool)]
    public static extern bool PathIsDirectory([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath);

Для дальнейшего разъяснения некоторых комментариев...

Представляющий неуправляемый код в этом не больше по сути опасен, чем ни один другой файл или связанные с вводом-выводом вызовы в.NET, так как они в конечном счете все призывают к неуправляемому коду.

Это - единственный вызов функции с помощью строки. Вы не представляете новых типов данных и/или использования памяти путем вызывания этой функции. Да, действительно необходимо полагаться на неуправляемый код для надлежащей чистки, но у Вас в конечном счете есть та зависимость от большинства связанных с вводом-выводом вызовов.

Для ссылки, вот код в Файл. GetAttributes (представляют путь в виде строки) от Отражателя:

public static FileAttributes GetAttributes(string path)
{
    string fullPathInternal = Path.GetFullPathInternal(path);
    new FileIOPermission(FileIOPermissionAccess.Read, new string[] { fullPathInternal }, false, false).Demand();
    Win32Native.WIN32_FILE_ATTRIBUTE_DATA data = new Win32Native.WIN32_FILE_ATTRIBUTE_DATA();
    int errorCode = FillAttributeInfo(fullPathInternal, ref data, false, true);
    if (errorCode != 0)
    {
        __Error.WinIOError(errorCode, fullPathInternal);
    }
    return (FileAttributes) data.fileAttributes;
}

, Как Вы видите, это также призывает к неуправляемому коду для получения атрибутов файла, таким образом, arguements о представлении неуправляемого кода, являющегося опасным, недопустимы. Аналогично, аргумент о пребывании полностью в управляемом коде. Нет никакой реализации управляемого кода, чтобы сделать это. Даже вызов Файла. GetAttributes () как другие ответы делают предложение, имеют те же "проблемы" вызова unmanged код, и я полагаю, что это - более надежный метод для выполнения определения, если путь является каталогом.

Редактирование Для ответа на комментарий @Christian K о CAS. Я верю единственной причине, GetAttributes делает спрос на безопасность, то, потому что это должно считать свойства файла, таким образом, это хочет удостовериться, что код вызова имеет разрешение сделать так. Это не то же как базовые проверки ОС (если существует кто-либо). Можно всегда создавать функцию обертки вокруг вызова P/Invoke к PathIsDirectory, который также требует определенные полномочия CAS при необходимости.

9
задан oO. 15 September 2009 в 23:11
поделиться

4 ответа

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, чтобы дать пользователю время перед тем, как сделать заставку «постоянной».

3
ответ дан 4 December 2019 в 08:52
поделиться

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

start logon.scr /s

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

РЕДАКТИРОВАТЬ: я не знаю, поставляется ли Windows 7 с logon.scr , убедитесь, что вы тестируете его с .scr , который фактически установлен в Windows 7.

Обратите внимание, что у меня возникла идея просто вызвать .scr с помощью / s из Пример команды заставки Параметры линии : запускает его одной из трех команд параметры строки:

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

РЕДАКТИРОВАТЬ 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"

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

Возможно, невозможно воспроизвести поведение системы при запуске экранной заставки и защиты паролем по резюме. Даже ответ на запрос «Запустить системную заставку из C # Windows Form» только запускает хранитель экрана, он не защищает паролем при возобновлении.

10
ответ дан 4 December 2019 в 08:52
поделиться
2
ответ дан 4 December 2019 в 08:52
поделиться

Объединение cmd и vbs идей сценария с кодом из ответа на запуск заставки системы от 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();
    }
}

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

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

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

6
ответ дан 4 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: