SetThreadExecutionState is not working when called from windows service

前端 未结 3 1003
暗喜
暗喜 2021-02-13 20:15

I want prevent system from going to sleep/hibernate from a windows service. I am calling SetThreadExecutionState function to do that. But it seems to have no effec

3条回答
  •  遥遥无期
    2021-02-13 20:28

    Here's my solution, hope it helps. Seems to work on Windows 10. Usage:

    PowerUtilities.PreventPowerSave();

    ... then later

    PowerUtilities.Shutdown();

    Not meant to be re-callable.

    using System;
    using System.Runtime.InteropServices;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace KeepAlive
    {
        public static class PowerUtilities
        {
            [Flags]
            public enum EXECUTION_STATE : uint
            {
                ES_AWAYMODE_REQUIRED = 0x00000040,
                ES_CONTINUOUS = 0x80000000,
                ES_DISPLAY_REQUIRED = 0x00000002,
                ES_SYSTEM_REQUIRED = 0x00000001
                // Legacy flag, should not be used.
                // ES_USER_PRESENT = 0x00000004
            }
            [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            static extern uint SetThreadExecutionState(EXECUTION_STATE esFlags);
    
            private static AutoResetEvent _event = new AutoResetEvent(false);
    
            public static void PreventPowerSave()
            {
                (new TaskFactory()).StartNew(() =>
                    {
                        SetThreadExecutionState(
                            EXECUTION_STATE.ES_CONTINUOUS
                            | EXECUTION_STATE.ES_DISPLAY_REQUIRED
                            | EXECUTION_STATE.ES_SYSTEM_REQUIRED);
                        _event.WaitOne();
    
                    },
                    TaskCreationOptions.LongRunning);
            }
    
            public static void Shutdown()
            {
                _event.Set();
            }
        }
    }
    

提交回复
热议问题