2 using System.Collections.Generic;
\r
5 using System.Threading.Tasks;
\r
6 using System.Runtime.InteropServices;
\r
7 using System.Diagnostics;
\r
14 public static class CPowerPlan
\r
16 // 参考: 電源プラン制御: http://www.fsmpi.uni-bayreuth.de/~dun3/archives/programmatically-change-power-options-using-cshar/519.html
\r
17 // 参考: ConnectedStandby判別: https://social.msdn.microsoft.com/Forums/en-US/eeb164a3-8ceb-4eb2-8768-4faaa7218c59/how-to-experimentally-confirm-that-connected-standby-mode-is-enabled-on-a-computer-system?forum=tailoringappsfordevices
\r
18 // http://stackoverflow.com/questions/20407094/c-sharp-how-to-use-callntpowerinformation-with-interop-to-get-system-power-infor
\r
20 readonly private static Guid GuidHighPerformance = new Guid( "8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c" ); // Vista以降は全部これのはず
\r
21 private static Guid GuidBackup = Guid.Empty;
\r
22 private static bool bConnectedStandbySupported = false;
\r
25 public static void BackupCurrentPowerPlan()
\r
27 bConnectedStandbySupported = IsConnetedStandbySupported();
\r
29 if ( bConnectedStandbySupported )
\r
35 GuidBackup = GetActivePowerPlan();
\r
36 Trace.TraceInformation( "現在の電源プラン「{0}」をバックアップしました。", GetFriendlyName( GuidBackup ) );
\r
41 /// Connected Standbyサポート機種かどうかの判定
\r
42 /// (Connected Standby機種に対しては、電源プラン操作を行わない)
\r
44 private static bool IsConnetedStandbySupported()
\r
46 if ( !COS.bIsWin8OrLater )
\r
48 // Win8以前であれば、ConnectedStandby非サポートが確定
\r
52 CWin32.SYSTEM_POWER_CAPABILITIES cap;
\r
53 uint retval = CWin32.CallNtPowerInformation(
\r
54 (int) CWin32.POWER_INFORMATION_LEVEL.SystemPowerCapabilities,
\r
58 Marshal.SizeOf( typeof( CWin32.SYSTEM_POWER_CAPABILITIES ) )
\r
62 Debug.WriteLine( "SYSTEM_POWER_CAPABILITIES.AOAC: " + cap.AoAc );
\r
65 Debug.WriteLine( "Connected Standby is enabled." );
\r
70 Debug.WriteLine( "Connected Standby is NOT enabled." );
\r
76 Debug.WriteLine( "CallNtPowerInformation returned: " + retval );
\r
77 //Debug.WriteLine( "Call to CallNTPowerInformation failed. GetLastError: %d\n", GetLastError() );
\r
82 public static void RestoreCurrentPowerPlan()
\r
84 if ( bConnectedStandbySupported )
\r
90 if ( GuidBackup != System.Guid.Empty )
\r
92 SetActivePowerPlan( GuidBackup );
\r
93 Trace.TraceInformation( "電源プランを、「{0}」に戻しました。", GetFriendlyName( GuidBackup ) );
\r
94 GuidBackup = System.Guid.Empty;
\r
98 public static void ChangeHighPerformance()
\r
100 if ( bConnectedStandbySupported )
\r
102 Trace.TraceInformation( "ConnectedStandby対応機種のため、電源プランの変更を行いません。" );
\r
106 SetActivePowerPlan( GuidHighPerformance );
\r
107 Trace.TraceInformation( "電源プランを、「{0}」に変更しました。", GetFriendlyName( GuidHighPerformance ) );
\r
113 private static void SetActivePowerPlan( Guid powerSchemeId )
\r
115 var schemeGuid = powerSchemeId;
\r
116 CWin32.PowerSetActiveScheme( IntPtr.Zero, ref schemeGuid );
\r
119 private static Guid GetActivePowerPlan()
\r
121 IntPtr pCurrentSchemeGuid = IntPtr.Zero;
\r
122 CWin32.PowerGetActiveScheme( IntPtr.Zero, ref pCurrentSchemeGuid );
\r
123 var currentSchemeGuid = (Guid) Marshal.PtrToStructure( pCurrentSchemeGuid, typeof( Guid ) );
\r
124 return currentSchemeGuid;
\r
128 private static IEnumerable<Guid> FindAll()
\r
130 var schemeGuid = Guid.Empty;
\r
131 uint sizeSchemeGuid = (uint) Marshal.SizeOf( typeof( Guid ) );
\r
132 uint schemeIndex = 0;
\r
133 while ( CWin32.PowerEnumerate( IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, (uint) CWin32.AccessFlags.ACCESS_SCHEME,
\r
134 schemeIndex, ref schemeGuid, ref sizeSchemeGuid ) == 0 )
\r
136 yield return schemeGuid;
\r
141 private static string GetFriendlyName( Guid schemeGuid )
\r
143 uint sizeName = 1024;
\r
144 IntPtr pSizeName = Marshal.AllocHGlobal( (int) sizeName );
\r
145 string friendlyName;
\r
149 CWin32.PowerReadFriendlyName( IntPtr.Zero, ref schemeGuid, IntPtr.Zero, IntPtr.Zero, pSizeName, ref sizeName );
\r
150 friendlyName = Marshal.PtrToStringUni( pSizeName );
\r
154 Marshal.FreeHGlobal( pSizeName );
\r
156 return friendlyName;
\r