Ответ 1
theoldnewthing имеет ваш ответ: используйте SetThreadExecutionState(ES_DISPLAY_REQUIRED)
.
Это используется видеоплеерами и PowerPoint.
Для конкретного приложения мне нужно, чтобы экранная заставка была отключена во время ее работы. Оператор МОЖЕТ вручную отключить его, а затем вернуться позже, но самое легкое, что нужно сделать, - просто сохранить экранную заставку в ожидании приложения.
Как мне это сделать? Я нашел код для фактического отключения экранной заставки с помощью SPI_SETSCREENSAVEACTIVE, но я не думаю, что я хочу.
theoldnewthing имеет ваш ответ: используйте SetThreadExecutionState(ES_DISPLAY_REQUIRED)
.
Это используется видеоплеерами и PowerPoint.
[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, мертвая точка
SystemParametersInfo с SPI_SETSCREENSAVEACTIVE - это нормальный способ сделать это. Однако он не отключает блокировку экрана.
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 (оба должны быть вызваны)... Это будет reset периодически как таймер для системы, так и дисплей в режиме ожидания. В других версиях Windows рекомендуется использовать ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED | ES_CONTINUOUS | ES_AWAYMODE_REQUIRED...
попробуйте сделать свою форму наивысшим значением true, это работает для меня, экранная заставка никогда не появлялась даже после простоя...