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

Как предотвратить выход Windows из состояния ожидания?

Я работаю над приложением С#, которое работает в фоновом режиме без какого-либо контроля Windows.

Я хочу уведомить Windows о том, что мое приложение все еще жив, чтобы предотвратить переход Windows в состояние ожидания.

Существуют ли какие-либо API-интерфейсы для вызова из моего приложения, которые уведомляют ОС Windows о том, что мое приложение все еще жив?

Спасибо заранее.

4b9b3361

Ответ 1

Вы должны использовать функцию SetThreadExecutionState. Что-то вроде этого:

public partial class MyWinForm: Window
{
    private uint fPreviousExecutionState;

    public Window1()
    {
        InitializeComponent();

        // Set new state to prevent system sleep
        fPreviousExecutionState = NativeMethods.SetThreadExecutionState(
            NativeMethods.ES_CONTINUOUS | NativeMethods.ES_SYSTEM_REQUIRED);
        if (fPreviousExecutionState == 0)
        {
            Console.WriteLine("SetThreadExecutionState failed. Do something here...");
            Close();
        }
    }

    protected override void OnClosed(System.EventArgs e)
    {
        base.OnClosed(e);

        // Restore previous state
        if (NativeMethods.SetThreadExecutionState(fPreviousExecutionState) == 0)
        {
            // No way to recover; already exiting
        }
    }
}

internal static class NativeMethods
{
    // Import SetThreadExecutionState Win32 API and necessary flags
    [DllImport("kernel32.dll")]
    public static extern uint SetThreadExecutionState(uint esFlags);
    public const uint ES_CONTINUOUS = 0x80000000;
    public const uint ES_SYSTEM_REQUIRED = 0x00000001;
}

Ответ 2

У вас есть несколько вариантов:

  • Используйте SetThreadExecutionState, который:

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

    Где вы можете использовать флаг ES_SYSTEM_REQUIRED для

    Заставляет систему находиться в рабочем состоянии, сбросив таймер простоя системы.

  • Используйте SendInput, чтобы подделать нажатие клавиши, движение мыши/клики

  • Другой альтернативой было бы изменить ваше приложение на службу Windows.

Пример SetThreadExecutionState

// Television recording is beginning. Enable away mode and prevent
// the sleep idle time-out.
SetThreadExecutionState(
    ES_CONTINUOUS | 
    ES_SYSTEM_REQUIRED | 
    ES_AWAYMODE_REQUIRED);

// Wait until recording is complete...
// Clear EXECUTION_STATE flags to disable away mode and allow the system
// to idle to sleep normally.
SetThreadExecutionState(ES_CONTINUOUS);

Ответ 3

Вы можете использовать SetThreadExecutionState, описанную здесь:

Так как это функция Win32 API, чтобы использовать ее с С#, вам понадобится PInvoke. Этапы описаны здесь, включая примерный метод PreventSleep для временного отключения режима ожидания:

Ответ 4

Я не думаю, что это можно сделать прямо в управляемом коде.

Быстрый поиск показывает этот сообщение от 2 лет назад. В принципе, вам нужно будет сделать какой-либо interop для вызова raw API окон.

Ответ 5

Вот SetThreadExecutionState реализация С#