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





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, мертвая точка
Ага, я тоже им пользуюсь :)
Прекрасно работает! Самое простое рабочее решение, которое я смог найти. Спасибо!
ES_AWAYMODE_REQUIRED использовать нельзя. У меня работает без этого флага на Win10.
SetThreadExecutionState (EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_SYSTEM_REQUIRED); - отлично работает на win10, чтобы отключить заставку
Стоит отметить, что при использовании ES_AWAYMODE_REQIURED компьютер не сможет перейти в спящий режим, даже если он включен пользователем вручную.
Я использую это в программе, ориентированной на .NET 4.5, но экран по-прежнему тускнеет и становится черным, а система через некоторое время засыпает. Что еще можно попробовать ??
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS
| EXECUTION_STATE.ES_DISPLAY_REQUIRED
| EXECUTION_STATE.ES_SYSTEM_REQUIRED);
Фактически, эта функция не является перекрестной для разных версий Windows (хотя она довольно хорошо работает в Windows Vista и выше) ... В Windows XP / 2003 эта функция должна вызываться с ES_USER_PRESENT | ES_CONTINUOUS (должны вызываться оба) ... Это будет периодически сбрасывать как систему, так и отображать таймеры простоя ... В других версиях Windows рекомендуется использовать ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED | ES_CONTINUOUS | ES_AWAYMODE_REQUIRED ...
Протестировал это с w7 x64, работал отлично! Не срабатывали заставки и функции энергосбережения монитора. +1!