Решён
Как программе деактивировать заставку в Windows 10

Сергей .NET C#/.NET
366
6

Пишу плеер на C# под Windows 10. Столкнулся с проблемой: во время воспроизведения длинных видео через некоторое время запускается системная заставка (скринсейвер) или монитор просто тухнет по таймеру бездействия.

Как программе деактивировать заставку в windows 10 программно? Хочется сделать это правильно, чтобы система понимала, что идет воспроизведение медиа, и не засыпала. Желательно без костылей с симуляцией движения мышки.

Решение
33
Эксперт • 1 ответ

Для предотвращения запуска заставки в Windows 10 правильный путь - использовать SetThreadExecutionState через P/Invoke. Любые другие методы с симуляцией нажатия клавиш или движением курсора мыши мешают пользователю и ломают логику работы системы.

Вам нужно импортировать функцию из kernel32.dll и вызывать ее с нужными флагами. Вот рабочий пример кода:

using System;
using System.Runtime.InteropServices;

public class SystemSleepPreventer
{
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern uint SetThreadExecutionState(uint esFlags);

    private const uint ES_CONTINUOUS = 0x80000000;
    private const uint ES_DISPLAY_REQUIRED = 0x00000002;
    private const uint ES_SYSTEM_REQUIRED = 0x00000001;

    public static void PreventSleep()
    {
        SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED);
    }

    public static void AllowSleep()
    {
        SetThreadExecutionState(ES_CONTINUOUS);
    }
}

Вызывайте PreventSleep при старте видео, а AllowSleep - при паузе или остановке. Обратите внимание, что состояние привязано к потоку. Если ваш поток завершится, Windows автоматически вернет стандартный режим сна для монитора.

Аватар Сергей .NET

Спасибо, проверил, метод рабочий. Теперь экран не тухнет во время воспроизведения.

7
Участник • 2 ответа

Можно еще через реестр отключать заставку, меняя ScreenSaveActive в ветке панели управления на ноль, а потом возвращать обратно. Но это костыль, который может сломать настройки пользователя, если программа вылетит с ошибкой.

11
Участник • 1 ответ

Используй функцию SetThreadExecutionState из WinAPI. Это стандартный способ, который используют все нормальные плееры.

9
Эксперт • 2 ответа

Обязательно оберните вызов возврата к обычному режиму сна в блок try-finally или обрабатывайте закрытие приложения. Иначе, если у вас плеер зависнет или упадет по ошибке, компьютер пользователя останется гореть всю ночь и не уйдет в спящий режим.

6
Эксперт • 3 ответа

Во-первых, заставка сейчас официально называется экранной заставкой, а не скринсейвером, её функция давно устарела на современных мониторах. Во-вторых, пишите Windows всегда с большой буквы. Что касается кода, использование SetThreadExecutionState действительно является единственно верным решением, все остальные варианты с эмуляцией ввода - это грубейшее нарушение гайдлайнов разработки под операционные системы Microsoft.

0
Участник • 1 ответ

Этот вопрос разжеван в доках микрософта уже лет двадцать как. Неужели так сложно открыть MSDN перед тем как писать темы на форумах?

Написать ответ

Премодерация гостей

Вы отвечаете как гость. Ваш ответ будет скрыт до проверки модератором. Чтобы ответ появился сразу и вы получали репутацию — войдите в аккаунт.

Будьте вежливы и соблюдайте правила платформы.