+++ /dev/null
-using System;\r
-using System.Collections.Generic;\r
-using System.Linq;\r
-using System.Text;\r
-using System.Threading.Tasks;\r
-using System.Runtime.InteropServices;\r
-using System.Diagnostics;\r
-\r
-namespace FDK\r
-{\r
- /// <summary>\r
- /// 電源プランの制御を行う\r
- /// </summary>\r
- public static class CPowerPlan\r
- {\r
- // 参考: 電源プラン制御: http://www.fsmpi.uni-bayreuth.de/~dun3/archives/programmatically-change-power-options-using-cshar/519.html\r
- // 参考: 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
- // http://stackoverflow.com/questions/20407094/c-sharp-how-to-use-callntpowerinformation-with-interop-to-get-system-power-infor\r
-\r
- readonly private static Guid GuidHighPerformance = new Guid( "8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c" ); // Vista以降は全部これのはず\r
- private static Guid GuidBackup = Guid.Empty;\r
- private static bool bConnectedStandbySupported = false;\r
-\r
-\r
- public static void BackupCurrentPowerPlan()\r
- {\r
- bConnectedStandbySupported = IsConnetedStandbySupported();\r
- \r
- if ( bConnectedStandbySupported )\r
- {\r
- // 何もしない\r
- }\r
- else\r
- {\r
- GuidBackup = GetActivePowerPlan();\r
- Trace.TraceInformation( "現在の電源プラン「{0}」をバックアップしました。", GetFriendlyName( GuidBackup ) );\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// Connected Standbyサポート機種かどうかの判定\r
- /// (Connected Standby機種に対しては、電源プラン操作を行わない)\r
- /// </summary>\r
- private static bool IsConnetedStandbySupported()\r
- {\r
- if ( !COS.bIsWin8OrLater )\r
- {\r
- // Win8以前であれば、ConnectedStandby非サポートが確定\r
- return false;\r
- }\r
-\r
- CWin32.SYSTEM_POWER_CAPABILITIES cap;\r
- uint retval = CWin32.CallNtPowerInformation(\r
- (int) CWin32.POWER_INFORMATION_LEVEL.SystemPowerCapabilities,\r
- IntPtr.Zero,\r
- 0,\r
- out cap,\r
- Marshal.SizeOf( typeof( CWin32.SYSTEM_POWER_CAPABILITIES ) )\r
- );\r
- if ( retval == 0 )\r
- {\r
- //Debug.WriteLine( "SYSTEM_POWER_CAPABILITIES.AOAC: " + cap.AoAc );\r
- if ( cap.AoAc )\r
- {\r
- //Debug.WriteLine( "Connected Standby is enabled." );\r
- return true;\r
- }\r
- else\r
- {\r
- //Debug.WriteLine( "Connected Standby is NOT enabled." );\r
- return false;\r
- }\r
- }\r
- else\r
- {\r
- Debug.WriteLine( "CallNtPowerInformation returned: " + retval );\r
- //Debug.WriteLine( "Call to CallNTPowerInformation failed. GetLastError: %d\n", GetLastError() );\r
- return false;\r
- }\r
- }\r
-\r
- public static void RestoreCurrentPowerPlan()\r
- {\r
- if ( bConnectedStandbySupported )\r
- {\r
- // 何もしない\r
- }\r
- else\r
- {\r
- if ( GuidBackup != System.Guid.Empty )\r
- {\r
- SetActivePowerPlan( GuidBackup );\r
- Trace.TraceInformation( "電源プランを、「{0}」に戻しました。", GetFriendlyName( GuidBackup ) );\r
- GuidBackup = System.Guid.Empty;\r
- }\r
- }\r
- }\r
- public static void ChangeHighPerformance()\r
- {\r
- if ( bConnectedStandbySupported )\r
- {\r
- Trace.TraceInformation( "ConnectedStandby対応機種のため、電源プランの変更を行いません。" );\r
- }\r
- else\r
- {\r
- SetActivePowerPlan( GuidHighPerformance );\r
- Trace.TraceInformation( "電源プランを、「{0}」に変更しました。", GetFriendlyName( GuidHighPerformance ) );\r
- }\r
- }\r
-\r
-\r
-\r
- private static void SetActivePowerPlan( Guid powerSchemeId )\r
- {\r
- var schemeGuid = powerSchemeId;\r
- CWin32.PowerSetActiveScheme( IntPtr.Zero, ref schemeGuid );\r
- }\r
-\r
- private static Guid GetActivePowerPlan()\r
- {\r
- IntPtr pCurrentSchemeGuid = IntPtr.Zero;\r
- CWin32.PowerGetActiveScheme( IntPtr.Zero, ref pCurrentSchemeGuid );\r
- var currentSchemeGuid = (Guid) Marshal.PtrToStructure( pCurrentSchemeGuid, typeof( Guid ) );\r
- return currentSchemeGuid;\r
- }\r
-\r
-\r
- private static IEnumerable<Guid> FindAll()\r
- {\r
- var schemeGuid = Guid.Empty;\r
- uint sizeSchemeGuid = (uint) Marshal.SizeOf( typeof( Guid ) );\r
- uint schemeIndex = 0;\r
- while ( CWin32.PowerEnumerate( IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, (uint) CWin32.AccessFlags.ACCESS_SCHEME,\r
- schemeIndex, ref schemeGuid, ref sizeSchemeGuid ) == 0 )\r
- {\r
- yield return schemeGuid;\r
- schemeIndex++;\r
- }\r
- }\r
-\r
- private static string GetFriendlyName( Guid schemeGuid )\r
- {\r
- uint sizeName = 1024;\r
- IntPtr pSizeName = Marshal.AllocHGlobal( (int) sizeName );\r
- string friendlyName;\r
-\r
- try\r
- {\r
- CWin32.PowerReadFriendlyName( IntPtr.Zero, ref schemeGuid, IntPtr.Zero, IntPtr.Zero, pSizeName, ref sizeName );\r
- friendlyName = Marshal.PtrToStringUni( pSizeName );\r
- }\r
- finally\r
- {\r
- Marshal.FreeHGlobal( pSizeName );\r
- }\r
- return friendlyName;\r
- }\r
- }\r
-}\r