2014-10-09 22 views
5

Bilgisayarınızda sahip olduğunuz tüm güç planlarını C# kullanarak almak istiyorum.Windows güç planlarını/şemalarını C# (WinAPI kullanarak) edinin

Sana bir şekilde API PowerEnumerate işlevi kullanmak mümkün olabilir düşünüyordum: Nasıl

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

Ama ben gerçekten C. bilmiyorum olarak nasıl hiçbir fikrim yok .. Yani can Tüm mevcut güç planları ile numaralandırıyorum ve bunların bir listesini oluşturuyorum. Daha sonra her bir güç planına GUID ve onların "kullanıcı dostu adı" na erişmek istiyorum.

Öyleyse .. Belki de, C# 'dan WinAPI' yı kullanmak isteyen bir kişi yardım etmek isterse, bu harika olurdu - ya da birisi daha iyi bir çözüme sahipse. Buna gerçekten iyi bir cevap bulmaya çalıştım ama hiç yok gibi görünüyor. Bence bu bir çok insana yardım eder.

Bu konuda yardımcı olabilecek herhangi biri var mı?

cevap

6

Bu yapmalıyım:

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

Sen güvenlik amacıyla yönetici olarak bu programı çalıştırmak gerekebilir.

+0

İstediğim gibi çalışır! Çok teşekkürler!! Eğer zamanınız varsa, bu tür şeylerin nasıl yapılacağını öğrenebileceğim bir öğreticiye bağlantı kurabilirseniz iyi olur. Yine teşekkürler! – CrashproofCode

+0

Blech ... P/Invoke yerine C++/CLI kullanın. Herkesinki kendine... –

İlgili konular