Необходимо отключить заставку / блокировку экрана в Windows C# /. Net

Для конкретного приложения мне нужно, чтобы хранитель экрана был отключен во время его работы. Оператор МОЖЕТ вручную выключить его, а затем снова включить позже, но проще всего было бы просто держать экранную заставку на расстоянии во время работы приложения.

Как мне это сделать? Я нашел код для фактического отключения экранной заставки с помощью SPI_SETSCREENSAVEACTIVE, но я не думаю, что это то, что мне нужно.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
27
0
17 535
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

SystemParametersInfo с SPI_SETSCREENSAVEACTIVE - это нормальный способ сделать это. Однако он не отключает блокировку экрана.

Ответ принят как подходящий

У старое новое есть ваш ответ: используйте SetThreadExecutionState(ES_DISPLAY_REQUIRED).

Это используется видеопроигрывателями и PowerPoint.

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

ИЗМЕНИТЬ - у меня есть обновленный ответ с использованием современного API запроса доступности питания (заменяет SetThreadExecutionState) здесь: https://stackoverflow.com/a/63632916/67824

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

public static class SleepUtil
{
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
}

public void PreventSleep()
{
    if (SleepUtil.SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS
        | EXECUTION_STATE.ES_DISPLAY_REQUIRED  
        | EXECUTION_STATE.ES_SYSTEM_REQUIRED 
        | EXECUTION_STATE.ES_AWAYMODE_REQUIRED) == 0) //Away mode for Windows >= Vista
        SleepUtil.SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS
            | EXECUTION_STATE.ES_DISPLAY_REQUIRED 
            | EXECUTION_STATE.ES_SYSTEM_REQUIRED); //Windows < Vista, forget away mode
}

Кредит: P / Invoke, мертвая точка

Протестировал это с w7 x64, работал отлично! Не срабатывали заставки и функции энергосбережения монитора. +1!

Gerardo Grignoli 02.01.2011 20:37

Ага, я тоже им пользуюсь :)

Ohad Schneider 02.01.2011 21:36

Прекрасно работает! Самое простое рабочее решение, которое я смог найти. Спасибо!

Nelson Reis 17.05.2012 19:21
ES_AWAYMODE_REQUIRED использовать нельзя. У меня работает без этого флага на Win10.
xmedeko 05.10.2015 21:22

SetThreadExecutionState (EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_SYSTEM_REQUIRED); - отлично работает на win10, чтобы отключить заставку

user1005462 06.10.2015 15:33

Стоит отметить, что при использовании ES_AWAYMODE_REQIURED компьютер не сможет перейти в спящий режим, даже если он включен пользователем вручную.

user1414213562 01.11.2016 16:30

Я использую это в программе, ориентированной на .NET 4.5, но экран по-прежнему тускнеет и становится черным, а система через некоторое время засыпает. Что еще можно попробовать ??

mrid 11.03.2019 08:20
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS
            | EXECUTION_STATE.ES_DISPLAY_REQUIRED 
            | EXECUTION_STATE.ES_SYSTEM_REQUIRED);

Это не помогает в XP.

Фактически, эта функция не является перекрестной для разных версий Windows (хотя она довольно хорошо работает в Windows Vista и выше) ... В Windows XP / 2003 эта функция должна вызываться с ES_USER_PRESENT | ES_CONTINUOUS (должны вызываться оба) ... Это будет периодически сбрасывать как систему, так и отображать таймеры простоя ... В других версиях Windows рекомендуется использовать ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED | ES_CONTINUOUS | ES_AWAYMODE_REQUIRED ...

Другие вопросы по теме