OSDN Git Service

#36256 スキンフォルダの保存パスが相対パスになるよう修正。
[dtxmania/dtxmania.git] / FDK17プロジェクト / コード / 00.共通 / CPowerPlan.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Linq;\r
4 using System.Text;\r
5 using System.Threading.Tasks;\r
6 using System.Runtime.InteropServices;\r
7 using System.Diagnostics;\r
8 \r
9 namespace FDK\r
10 {\r
11         /// <summary>\r
12         /// 電源プランの制御を行う\r
13         /// </summary>\r
14         public static class CPowerPlan\r
15         {\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
19 \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
23 \r
24 \r
25                 public static void BackupCurrentPowerPlan()\r
26                 {\r
27                         bConnectedStandbySupported = IsConnetedStandbySupported();\r
28                         \r
29                         if ( bConnectedStandbySupported )\r
30                         {\r
31                                 // 何もしない\r
32                         }\r
33                         else\r
34                         {\r
35                                 GuidBackup = GetActivePowerPlan();\r
36                                 Trace.TraceInformation( "現在の電源プラン「{0}」をバックアップしました。", GetFriendlyName( GuidBackup ) );\r
37                         }\r
38                 }\r
39 \r
40                 /// <summary>\r
41                 /// Connected Standbyサポート機種かどうかの判定\r
42                 /// (Connected Standby機種に対しては、電源プラン操作を行わない)\r
43                 /// </summary>\r
44                 private static bool IsConnetedStandbySupported()\r
45                 {\r
46                         if ( !COS.bIsWin8OrLater )\r
47                         {\r
48                                 // Win8以前であれば、ConnectedStandby非サポートが確定\r
49                                 return false;\r
50                         }\r
51 \r
52                         CWin32.SYSTEM_POWER_CAPABILITIES cap;\r
53                         uint retval = CWin32.CallNtPowerInformation(\r
54                                 (int) CWin32.POWER_INFORMATION_LEVEL.SystemPowerCapabilities,\r
55                                 IntPtr.Zero,\r
56                                 0,\r
57                                 out cap,\r
58                                 Marshal.SizeOf( typeof( CWin32.SYSTEM_POWER_CAPABILITIES ) )\r
59                         );\r
60                         if ( retval == 0 )\r
61                         {\r
62                                 Debug.WriteLine( "SYSTEM_POWER_CAPABILITIES.AOAC: " + cap.AoAc );\r
63                                 if ( cap.AoAc )\r
64                                 {\r
65                                         Debug.WriteLine( "Connected Standby is enabled." );\r
66                                         return true;\r
67                                 }\r
68                                 else\r
69                                 {\r
70                                         Debug.WriteLine( "Connected Standby is NOT enabled." );\r
71                                         return false;\r
72                                 }\r
73                         }\r
74                         else\r
75                         {\r
76                                 Debug.WriteLine( "CallNtPowerInformation returned: " + retval );\r
77                                 //Debug.WriteLine( "Call to CallNTPowerInformation failed. GetLastError: %d\n", GetLastError() );\r
78                                 return false;\r
79                         }\r
80                 }\r
81 \r
82                 public static void RestoreCurrentPowerPlan()\r
83                 {\r
84                         if ( bConnectedStandbySupported )\r
85                         {\r
86                                 // 何もしない\r
87                         }\r
88                         else\r
89                         {\r
90                                 if ( GuidBackup != System.Guid.Empty )\r
91                                 {\r
92                                         SetActivePowerPlan( GuidBackup );\r
93                                         Trace.TraceInformation( "電源プランを、「{0}」に戻しました。", GetFriendlyName( GuidBackup ) );\r
94                                         GuidBackup = System.Guid.Empty;\r
95                                 }\r
96                         }\r
97                 }\r
98                 public static void ChangeHighPerformance()\r
99                 {\r
100                         if ( bConnectedStandbySupported )\r
101                         {\r
102                                 Trace.TraceInformation( "ConnectedStandby対応機種のため、電源プランの変更を行いません。" );\r
103                         }\r
104                         else\r
105                         {\r
106                                 SetActivePowerPlan( GuidHighPerformance );\r
107                                 Trace.TraceInformation( "電源プランを、「{0}」に変更しました。", GetFriendlyName( GuidHighPerformance ) );\r
108                         }\r
109                 }\r
110 \r
111 \r
112 \r
113                 private static void SetActivePowerPlan( Guid powerSchemeId )\r
114                 {\r
115                         var schemeGuid = powerSchemeId;\r
116                         CWin32.PowerSetActiveScheme( IntPtr.Zero, ref schemeGuid );\r
117                 }\r
118 \r
119                 private static Guid GetActivePowerPlan()\r
120                 {\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
125                 }\r
126 \r
127 \r
128                 private static IEnumerable<Guid> FindAll()\r
129                 {\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
135                         {\r
136                                 yield return schemeGuid;\r
137                                 schemeIndex++;\r
138                         }\r
139                 }\r
140 \r
141                 private static string GetFriendlyName( Guid schemeGuid )\r
142                 {\r
143                         uint sizeName = 1024;\r
144                         IntPtr pSizeName = Marshal.AllocHGlobal( (int) sizeName );\r
145                         string friendlyName;\r
146 \r
147                         try\r
148                         {\r
149                                 CWin32.PowerReadFriendlyName( IntPtr.Zero, ref schemeGuid, IntPtr.Zero, IntPtr.Zero, pSizeName, ref sizeName );\r
150                                 friendlyName = Marshal.PtrToStringUni( pSizeName );\r
151                         }\r
152                         finally\r
153                         {\r
154                                 Marshal.FreeHGlobal( pSizeName );\r
155                         }\r
156                         return friendlyName;\r
157                 }\r
158         }\r
159 }\r