在C#中获取Windows电源计划/方案(使用WinAPI)
本文关键字:方案 使用 WinAPI 计划 获取 Windows 电源 | 更新日期: 2023-09-27 18:26:03
我有兴趣使用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并愿意提供帮助,那就太好了——或者如果有人有更好的解决方案。我真的试图找到一个好的答案,但似乎没有。我认为这会帮助很多人。
有人能帮忙吗?
这应该做到:
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));
}
}
}
出于安全考虑,您可能必须以管理员身份运行此程序。