2014-10-09 10 views
5

Tôi muốn nhận tất cả các gói điện mà bạn có trong máy tính của mình bằng C#.Nhận các kế hoạch/sơ đồ điện của Windows trong C# (sử dụng WinAPI)

Tôi đã suy nghĩ bạn có thể sử dụng chức năng API PowerEnumerate một cách nào đó:

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

Nhưng tôi không có ý tưởng về cách như tôi thực sự không biết C. Vì vậy .. Làm thế nào có thể Tôi thích, liệt kê tất cả các kế hoạch điện sẵn có và tạo danh sách aa của chúng. Sau đó tôi muốn có thể truy cập mỗi GUID kế hoạch năng lượng và "tên thân thiện với người dùng" của họ.

Vì vậy .. Có lẽ nếu ai đó rất giỏi sử dụng WinAPI từ C# những người muốn giúp đỡ, đó sẽ là tuyệt vời - hoặc nếu ai đó có một giải pháp tốt hơn. Tôi đã thực sự cố gắng tìm một câu trả lời tốt cho điều này nhưng dường như không có bất kỳ câu trả lời nào. Tôi nghĩ điều này sẽ giúp rất nhiều người.

Có ai có thể trợ giúp việc này không?

Trả lời

6

này nên làm điều đó:

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

Bạn có thể phải chạy chương trình này as administrator cho các mục đích an ninh.

+0

Hoạt động giống như tôi muốn! Cảm ơn rất nhiều!! Nếu bạn có thời gian, nó sẽ là tốt đẹp nếu bạn có thể liên kết đến một số hướng dẫn, nơi tôi có thể tìm hiểu làm thế nào để làm điều này loại công cụ bản thân mình. Một lần nữa cám ơn! – CrashproofCode

+0

Blech ... sử dụng C++/CLI thay vì P/Invoke. Đối với mỗi của riêng mình ... –

Các vấn đề liên quan