【问题标题】:Get Windows power plans/schemes in C# (using WinAPI)在 C# 中获取 Windows 电源计划/方案(使用 WinAPI)
【发布时间】:2014-10-09 23:23:41
【问题描述】:

我有兴趣使用 C# 获取计算机中的所有电源计划。

我在想你也许可以以某种方式使用 API PowerEnumerate 函数:

DWORD WINAPI PowerEnumerate(
  _In_opt_   HKEY RootPowerKey,
  _In_opt_   const GUID *SchemeGuid,
  _In_opt_   const GUID *SubGroupOfPowerSettingsGuid,
  _In_       POWER_DATA_ACCESSOR AccessFlags,
  _In_       ULONG Index,
  _Out_opt_  UCHAR *Buffer,
  _Inout_    DWORD *BufferSize
);

但我不知道该怎么做,因为我真的不知道 C。所以.. 我怎么能喜欢,枚举所有可用的电源计划并创建一个列表。然后,我希望能够访问每个电源计划 GUID 及其“用户友好名称”。

所以.. 也许如果有人擅长使用 C# 中的 WinAPI 并愿意提供帮助,那就太好了 - 或者如果有人有更好的解决方案。我真的试图找到一个好的答案,但似乎没有。我想这会帮助很多人。

有人可以帮忙吗?

【问题讨论】:

    标签: c# c++ windows power-management


    【解决方案1】:

    应该这样做:

    using System;
    using System.Linq;
    using System.Reflection;
    using System.Runtime.InteropServices;
    using System.Collections.Generic;
    
    public class Program
    {
        [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
        }
    
        private static string ReadFriendlyName(Guid schemeGuid)
        {
            uint sizeName = 1024;
            IntPtr pSizeName = Marshal.AllocHGlobal((int)sizeName);
    
            string friendlyName;
    
            try
            {
                PowerReadFriendlyName(IntPtr.Zero, ref schemeGuid, IntPtr.Zero, IntPtr.Zero, pSizeName, ref sizeName);
                friendlyName = Marshal.PtrToStringUni(pSizeName);
            }
            finally
            {
                Marshal.FreeHGlobal(pSizeName);
            }
    
            return friendlyName;
        }
    
        public static IEnumerable<Guid> GetAll()
        {
            var schemeGuid = Guid.Empty;
    
            uint sizeSchemeGuid = (uint)Marshal.SizeOf(typeof(Guid));
            uint schemeIndex = 0;
    
            while (PowerEnumerate(IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, (uint)AccessFlags.ACCESS_SCHEME, schemeIndex, ref schemeGuid, ref sizeSchemeGuid) == 0)
            {
                yield return schemeGuid;
                schemeIndex++;
            }
        }
    
        public static void Main()
        {   
            var guidPlans = GetAll();
    
            foreach (Guid guidPlan in guidPlans)
            {
                Console.WriteLine(ReadFriendlyName(guidPlan));
            }
        }
    }
    

    出于安全考虑,您可能必须以管理员身份运行此程序。

    【讨论】:

    • 按我的意愿工作!万分感谢!!如果你有时间,如果你能链接到一些教程,我可以自己学习如何做这种事情,那就太好了。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多