Как отключить переход в спящий режим, когда работает программа?

194
03 октября 2019, 10:10

Написал программу, которая должна работать круглосуточно, поставил ее на ноутбук.

Как она работет:

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

Пробовал через powercfg.cpl, поставил "Отключать дисплей" и "Переводить компьютер в спящий режим" на НИКОГДА, но не помогло.

Скажите пожалуйста, как это можно поправить?

Answer 1

Вот тут перечислены следующие варианты:

  1. Вызывать у экземпляра класса DisplayRequest метод RequestActive
  2. Воспользоваться WinAPI SetThreadExecutionState и вызвать как-то так(сорс):

    // Set new state to prevent system sleep
    fPreviousExecutionState = NativeMethods.SetThreadExecutionState(
                NativeMethods.ES_CONTINUOUS | NativeMethods.ES_SYSTEM_REQUIRED);
    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;
    }
    
  3. Слушать WM_POWERBROADCAST сообщение. (Сорс EnSO)

    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
        // Power status event triggered
        if(m.Msg == (int)WindowMessage.WM_POWERBROADCAST)
        {
            // Machine is trying to enter suspended state
            if(m.WParam.ToInt32() == (int)WindowMessage.PBT_APMQUERYSUSPEND ||
                    m.WParam.ToInt32() == (int)WindowMessage.PBT_APMQUERYSTANDBY)
            {
                // Have perms to deny this message?
                if((m.LParam.ToInt32() & 0x1) != 0)
                {
                    // If so, deny broadcast message
                    m.Result = new IntPtr((int)WindowMessage.BROADCAST_QUERY_DENY);
                }
            }
            return;
        }
        base.WndProc(ref m);
    }
    

    }

        internal enum WindowMessage
    {
    /// <summary>
    /// Notify that machine power state is changing
    /// </summary>
    WM_POWERBROADCAST = 0x218,
    /// <summary>
    /// Message indicating that machine is trying to enter suspended state
    /// </summary>
    PBT_APMQUERYSUSPEND = 0x0,
    PBT_APMQUERYSTANDBY = 0x0001,
    /// <summary>
    /// Message to deny broadcast query
    /// </summary>
    BROADCAST_QUERY_DENY = 0x424D5144
    }
    
READ ALSO
Перегрузка унарного оператора &#171;!&#187;

Перегрузка унарного оператора «!»

Как правильно осуществить перегрузку и использовать в дальнейшем данный логический оператор «!»Если сравнивается следующие: если заданная...

113
Не могу найти ошибку в коде калькулятора

Не могу найти ошибку в коде калькулятора

есть такой код, который должен рассчитывать по данным стоимость домана сайте это выглядит как два селекта и поле для ввода метража

182
Вывод и редактирование новости php

Вывод и редактирование новости php

Нашел простой гайд как сделать админпанель с возможностью постинга и редактирования постовСделал всё как в видео, но добавление и редактирование...

134
Yandex XML не принимает ip

Yandex XML не принимает ip

У меня в YandexXML след значения:

137