Как предотвратить переход Windows в состояние ожидания? - PullRequest
40 голосов
/ 10 июня 2011

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

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

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

Заранее спасибо.

Ответы [ 5 ]

35 голосов
/ 10 июня 2011

Вы должны использовать функцию 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;
}
18 голосов
/ 10 июня 2011

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

  • Использование 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);
10 голосов
/ 10 июня 2011

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

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

0 голосов
/ 06 июля 2016

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

0 голосов
/ 10 июня 2011

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

Быстрый поиск показывает эту запись от 2 лет назад.По сути, вам нужно было бы сделать какое-нибудь взаимодействие, чтобы вызвать сырой Windows API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...