Смена параметров электропитания

хочу написать программу для смены действия при закрытии крышки ноутбука, но почему-то не получается поменять этот параметр. Пробовал и AC, и DC функции. Все вызовы завершаются успешно.

class PowerScheme
    {
    [DllImport("powrprof.dll")]
        static extern uint PowerEnumerate(
            IntPtr RootPowerKey,
            ref Guid SchemeGuid,
            ref Guid SubGroupOfPowerSetting,
            uint AccessFlags,
            uint Index,
            ref Guid Buffer,
            ref uint BufferSize);

        [DllImport("powrprof.dll")]
        static extern uint PowerGetActiveScheme(
            IntPtr UserRootPowerKey,
            ref IntPtr ActivePolicyGuid);

        [DllImport("powrprof.dll")]
        static extern uint PowerReadDCValue(
            IntPtr RootPowerKey,
            ref Guid SchemeGuid,
            IntPtr SubGroupOfPowerSettingGuid,
            ref Guid PowerSettingGuid,
            ref int Type,
            ref IntPtr Buffer,
            ref uint BufferSize
            );

        [DllImport("powrprof.dll")]
        static extern uint PowerWriteDCValueIndex(
            IntPtr RootPowerKey,
            ref Guid SchemeGuid,
            ref Guid SubGroupOfPowerSettingGuid,
            ref Guid PowerSettingGuid,
            uint AcValueIndex
            );

        [DllImport("PowrProf.dll")]
        static extern uint PowerSetActiveScheme(
          IntPtr UserRootPowerKey,
          ref Guid SchemeGuid);

        [DllImport("powrprof.dll", CharSet = CharSet.Unicode)]
        
[DllImport("PowrProf.dll")]
        public static extern UInt32 PowerEnumerate(IntPtr RootPowerKey, IntPtr SchemeGuid, IntPtr SubGroupOfPowerSettingGuid, UInt32 AcessFlags, UInt32 Index, ref Guid Buffer, ref UInt32 BufferSize);

        [DllImport("PowrProf.dll")]
        public static extern UInt32 PowerReadFriendlyName(IntPtr RootPowerKey, ref Guid SchemeGuid, IntPtr SubGroupOfPowerSettingGuid, IntPtr PowerSettingGuid, IntPtr Buffer, ref UInt32 BufferSize);

        public enum AccessFlags : uint
        {
            ACCESS_SCHEME = 16,
            ACCESS_SUBGROUP = 17,
            ACCESS_INDIVIDUAL_SETTING = 18
        }

        public enum LidAction : uint
        {
            DoNothing = 0,
            Sleep = 1,
            Hibernate = 2,
            ShutDown = 3
        }

        private const uint ERROR_MORE_DATA = 234;

        public static Guid[] PowerSchemeGetAll()
        {
            var schemeGuid = Guid.Empty;

            uint sizeSchemeGuid = (uint)Marshal.SizeOf(typeof(Guid));
            uint schemeIndex = 0;
            List<Guid> guidList = new List<Guid>();

            while (PowerEnumerate(IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, (uint)AccessFlags.ACCESS_SCHEME, schemeIndex, ref schemeGuid, ref sizeSchemeGuid) == 0)
            {
                guidList.Add(schemeGuid);
                schemeIndex++;
            }
            return guidList.ToArray();
        }

        public static uint PowerSchemeGetLidAction(ref Guid powerScheme, ref LidAction value)
        {
            uint res;

            //Get the Power Settings
            Guid actionGuid = Guid.Empty;
            uint index = 0;
            uint BufferSize = Convert.ToUInt32(Marshal.SizeOf(typeof(Guid)));

            while (PowerEnumerate(IntPtr.Zero, ref powerScheme, ref GUID_SYSTEM_BUTTON_SUBGROUP,
                            18, index, ref actionGuid, ref BufferSize) == 0) {

                /* Search for lid action by Guid */
                if (actionGuid != POWER_BUTTON_ACTION) {
                    index++;
                    continue;
                }

                uint size = 4;
                IntPtr temp = IntPtr.Zero;
                int type = 0;
                res = PowerReadDCValue(IntPtr.Zero, ref powerScheme, IntPtr.Zero,
                    ref actionGuid, ref type, ref temp, ref size);
                
                if (res != 0) {
                    /* error handling */
                    return res;
                }

                value = (LidAction)temp;
                return 0;
            }

            return 2;
        }

        public static uint PowerSchemeSetLidAction(ref Guid powerScheme, LidAction value)
        {
            uint res;
            res = PowerWriteDCValueIndex(IntPtr.Zero, ref powerScheme, ref GUID_SYSTEM_BUTTON_SUBGROUP,
                                         ref POWER_BUTTON_ACTION, (uint)value);
            if (res == 0)
                res = PowerSetActiveScheme(IntPtr.Zero, ref powerScheme);
            return res;
        }

        public static void EnumerateAllSchemes()
        {
            var guidPlans = PowerSchemeGetAll();
            Guid tmpGuid;
            foreach (Guid guidPlan in guidPlans)
            {
                tmpGuid = guidPlan;
                Console.WriteLine(ReadFriendlyName(guidPlan) + "\t" + guidPlan.ToString());
                LidAction lidAction = LidAction.DoNothing;
                if (PowerSchemeGetLidAction(ref tmpGuid, ref lidAction) == 0)
                    Console.WriteLine("Действие закрытия крышки = " + lidAction.ToString());
                PowerSchemeSetLidAction(ref tmpGuid, LidAction.DoNothing);
                if (PowerSchemeGetLidAction(ref tmpGuid, ref lidAction) == 0)
                    Console.WriteLine("Действие закрытия крышки = " + lidAction.ToString());

            }
        }

Ответы (0 шт):