2014-10-09 8 views
5

Jestem zainteresowany uzyskaniem wszystkich planów zasilania, które masz w komputerze przy użyciu C#.Uzyskaj plany/schematy zasilania systemu Windows w języku C# (przy użyciu WinAPI)

myślałem może być w stanie korzystać z funkcji API PowerEnumerate w jakiś sposób:

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 
); 

Ale nie mam pojęcia, w jaki sposób tak naprawdę nie wiem, C tak .. Jak można Lubię, wyliczyć wszystkie dostępne plany zasilania i utworzyć ich listę. Następnie chcę mieć dostęp do każdego GUID planu zasilania i ich "przyjaznej dla użytkownika nazwy".

Więc ... Może jeśli ktoś, kto jest dobry w korzystaniu z WinAPI z C#, który chciałby pomóc, byłoby świetnie - lub jeśli ktoś ma lepsze rozwiązanie. Naprawdę starałem się znaleźć dobrą odpowiedź na to, ale nie wydaje mi się, żeby było. Myślę, że pomogłoby to wielu ludziom.

Czy ktoś może w tym pomóc?

Odpowiedz

6

ten powinien zrobić:

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)); 
     } 
    } 
} 

Być może trzeba uruchomić ten program jako administrator dla celów bezpieczeństwa.

+0

Działa tak, jak chciałem! Wielkie dzięki!! Jeśli masz czas, byłoby miło, gdybyś mógł utworzyć link do samouczka, w którym sam mógłbym nauczyć się tego typu rzeczy. Jeszcze raz dzięki! – CrashproofCode

+0

Blech ... użyj C++/CLI zamiast P/Invoke. Do każdej jego własności... –

Powiązane problemy