Как предотвратить выход Windows из состояния ожидания?
Я работаю над приложением С#, которое работает в фоновом режиме без какого-либо контроля Windows.
Я хочу уведомить Windows о том, что мое приложение все еще жив, чтобы предотвратить переход Windows в состояние ожидания.
Существуют ли какие-либо API-интерфейсы для вызова из моего приложения, которые уведомляют ОС Windows о том, что мое приложение все еще жив?
Спасибо заранее.
Ответы
Ответ 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
реализация С#