С# Убить процесс перед тем, как компьютер перейдет в спящий режим

В Windows 10 у меня есть процесс, который я создал для запуска в фоновом режиме, который инициализируется при запуске. Когда компьютер переходит в спящий режим, он крашит окна и дает мне BSOD.

Я открыт для любого решения, однако в настоящее время я пытаюсь убить процесс, когда происходит событие «Приостановить» PowerModeChanged. Не похоже, что этого достаточно, чтобы убить процесс до того, как машина перейдет в состояние гибернации, и машина все еще дает сбой. Мой прослушиватель PowerModeChanged определенно работает, и это определенно вторичный процесс, вызывающий сбой машины.

Я немного новичок в разработке фоновых процессов, и я весь день пробовал разные подходы с незначительным прогрессом. Наверняка кто-то должен иметь опыт с этим и знает решение.

// Application path and command line arguments
    static string ApplicationPath = @"C:\path\to\program.exe";
    static Process ProcessObj = new Process();

    static void Main(string[] args)
    {
        SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(SystemEvents_PowerModeChanged);

        startProcess(); 
        Console.ReadKey(); 
    }

    static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
    {
        Console.WriteLine(e.Mode.ToString());
        if (e.Mode == PowerModes.Suspend)
        {
            ProcessObj.Kill(); 
        }

        if (e.Mode == PowerModes.Resume)
        {
            startProcess();
        }
    }

    static void startProcess()
    {

        // Create a new process object
        try
        {
            // StartInfo contains the startup information of the new process
            ProcessObj.StartInfo.FileName = ApplicationPath;

            // These two optional flags ensure that no DOS window appears
            ProcessObj.StartInfo.UseShellExecute = false;
            ProcessObj.StartInfo.CreateNoWindow = true;

            // This ensures that you get the output from the DOS application
            ProcessObj.StartInfo.RedirectStandardOutput = true;

            // Start the process
            ProcessObj.Start();

            // Wait that the process exits
            ProcessObj.WaitForExit();

            // Now read the output of the DOS application
            string Result = ProcessObj.StandardOutput.ReadToEnd();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }

person Justin Grant    schedule 14.06.2018    source источник
comment
Хотя вы говорите, что это фоновый процесс, может показаться, что на самом деле он работает как процесс переднего плана. Пожалуйста, объясните, как вы запускаете эту программу при запуске. Другими словами, как вызвать метод Main()?   -  person STLDev    schedule 14.06.2018
comment
Я думаю, что op означает тихое приложение, а не службу Windows или системный процесс более низкого уровня. Хотя StartProcess или ProcessStart — это точка входа для службы Windows.   -  person Ross Bush    schedule 14.06.2018
comment
используйте эту ссылку, чтобы ткнуть компьютер в глаз - blog.backslasher.net/windows-awake -ps.html   -  person    schedule 14.06.2018
comment
Дох! Прошла минута, OnStart() — это перегрузка производной службы.   -  person Ross Bush    schedule 14.06.2018
comment
Похоже, что в моем первоначальном подходе я лаял не в то дерево, но чтобы ответить на ваш вопрос, у меня есть 2 программы, одна из которых запускает этот код, который я поместил в каталог / Startup /. Другая программа — это вторичное приложение, примером которого является переменная ApplicationPath в примере кода. Я обновляю это, чтобы выбрать маршрут службы Windows. Спасибо!   -  person Justin Grant    schedule 14.06.2018


Ответы (1)


На платформе ОС Windows, когда кто-то действительно хочет запустить «фоновый процесс» для всей работающей машины и чтобы этот процесс выживал при событиях питания, таких как спящий режим, они обычно проектируют свой процесс как службу Windows.

Многие популярные приложения реализованы в виде служб Windows, таких как Microsoft SQL Server или собственный веб-сервер Windows (W3SVC).

Службы Windows можно создать в Visual Studio, выбрав создание нового проекта типа «Служба Windows».

Используя этот метод, вы сможете реагировать на несколько событий, включая следующие (определенные в System.ServiceProcess.ServiceBase):

  • OnStart(string[] args)
  • OnStop()
  • OnPause()
  • OnContinue()
  • OnPowerEvent(PowerBroadcastStatus powerStatus)
  • OnShutdown()

Дополнительную информацию о создании службы .NET для Windows можно найти здесь: https://docs.microsoft.com/en-us/dotnet/framework/windows-services/

person STLDev    schedule 14.06.2018