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

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

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

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

4b9b3361

Ответ 2

[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, мертвая точка

Ответ 3

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

Ответ 4

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 (оба должны быть вызваны)... Это будет reset периодически как таймер для системы, так и дисплей в режиме ожидания. В других версиях Windows рекомендуется использовать ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED | ES_CONTINUOUS | ES_AWAYMODE_REQUIRED...

Ответ 5

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