Используйте SetThreadExecutionState с приложением, которое еще не предотвращает переход в спящий режим.

В Windows 7 и 10 приложение Spotify не предотвращает отключение дисплея или переход системы в спящий режим (по крайней мере, на трех компьютерах с Windows, которые я использую). Есть ли способ запустить приложение и включить функцию SetThreadExecutionState в этот поток, чтобы предотвратить спящий режим дисплея во время работы приложения? Или любая другая функция, которая позволит достичь этого результата?

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


person buzz    schedule 10.08.2015    source источник
comment
В C довольно просто: вызовите SetThreadExecutionState, запустите Spotify, подождите, пока Spotify завершит работу, а затем выйдите самостоятельно. Я предполагаю, что тот же подход будет работать и в C#.   -  person Harry Johnston    schedule 10.08.2015
comment
Спасибо за ваш ответ. Я не привязан к использованию какого-либо конкретного языка, как это будет выглядеть в C?   -  person buzz    schedule 10.08.2015


Ответы (1)


Это решение С# не использует функцию SetThreadExecutionState, но вы упомянули, что у вас уже есть файлы .bat для изменения таймеров сна, поэтому вы можете скопировать команды из них сюда. Консольное приложение С#:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var spotify = new Process();
            spotify.StartInfo.FileName = "Spotify.exe";
            spotify.StartInfo.Arguments = "-v -s -a";
            Process.Start("powercfg", "-CHANGE -monitor-timeout-ac 0");
            spotify.Start();
            spotify.WaitForExit();
            var exitCode = spotify.ExitCode;
            spotify.Close();
            Process.Start("powercfg", "-CHANGE -monitor-timeout-ac 1");
        }
    }
}

Поместите больше строк Process.Start, чтобы изменить режим гибернации и т. д.

person Kellamity    schedule 10.08.2015
comment
Это решение работает как для Win 7, так и для 10, как было протестировано. Я заменил полный путь к файлу в spotify.StartInfo.FileName = "Spotify.exe"; на spotify.StartInfo.FileName = "C:\\Mypath\\Spotify.exe";, чтобы он заработал. Я также настроил его для запуска в качестве приложения Windows, чтобы консоль не зависала в фоновом режиме, согласно предложению @Hans Passant здесь: ссылка. Спасибо за вашу помощь! - person buzz; 11.08.2015
comment
Основная проблема с этим подходом заключается в том, что в случае сбоя или завершения работы программы вы не вернете настройки по умолчанию. Но если вы используете его только в своей системе, это, вероятно, не проблема. - person Harry Johnston; 11.08.2015