Подтвердить что ты не робот

Предотвращение блокировки рабочей станции Windows (рабочего стола) при запуске программы WPF

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

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

  • отправить событие переноса мыши Win32 через каждый фиксированный интервал времени (например, каждую минуту)
  • Можно отправить ключ к программе (например, клавиша "Левый сдвиг" ) каждый фиксированный интервал времени (например, каждую минуту)

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

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

4b9b3361

Ответ 1

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

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