Запретить блокировку рабочей станции Windows (рабочего стола) при запуске программы WPF - PullRequest
26 голосов
/ 22 декабря 2011

Проблема:
У меня есть WPF полноэкранное приложение , которое выступает в качестве панели мониторинга.Компьютер находится в домене, и политики домена обеспечивают его блокировку через 10 минут после последнего действия пользователя.Я хочу предотвратить автоматическую блокировку рабочей станции (или рабочего стола).
Пример такого поведения: проигрыватель Windows Media, который предотвращает это во время работы фильма.

Известные решения (вроде обходных путей)):

  1. Можно отправить событие перемещения мыши Win32 каждый фиксированный интервал времени (например, каждую минуту)
  2. Этоможно отправлять ключ в программу (например, клавиша «Влево») каждый фиксированный интервал времени (например, каждую минуту)

ВОПРОС:
Как я могу предотвратить блокировку рабочей станции Windows без этих обходных путей?

Отказ от ответственности:
Я был почти уверен, что должно бытьаналогичный вопрос где-то ответил на StackOverflow, но я не нашел ни одного.Буду признателен, если вы укажете мне правильное направление.

1 Ответ

27 голосов
/ 08 августа 2012

Решение было указано в комментариях, но я предоставляю простое стартовое решение для всех, кто прибывает через веб-поиск:

/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);

    public App()
    {
        InitializeComponent();

        App.Current.Startup += new StartupEventHandler((sender, e) =>
            {
                SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);
            });
        App.Current.Exit += new ExitEventHandler((sender, e) =>
            {
                SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);
            });
    }
}

[FlagsAttribute]
public enum EXECUTION_STATE : uint
{
    ES_AWAYMODE_REQUIRED = 0x00000040,
    ES_CONTINUOUS = 0x80000000,
    ES_DISPLAY_REQUIRED = 0x00000002,
    ES_SYSTEM_REQUIRED = 0x00000001
    // Legacy flag, should not be used.
    // ES_USER_PRESENT = 0x00000004
}

Альтернативное место для размещения логики - в обработчике событий для StateChanged в главном окне приложения:

this.StateChanged += new EventHandler((sender, e) =>
    {
        if (WindowState == System.Windows.WindowState.Maximized)
        {
            SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);
        }
        else
        {
            SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);
        }
    });
...