/// <summary> /// Get system power setting for indicated power status (Vista / Windows 7) /// </summary> /// <param name="settingType"></param> /// <returns>Returns value of power setting requested. Returns -1 on errors.</returns> private static int GetSystemPowerSetting(SystemPowerSettingType settingType, bool AC) { try { IntPtr ptr = IntPtr.Zero; Guid scheme; UInt32 value = 0; UInt32 success; PowerGetActiveScheme(IntPtr.Zero, ref ptr); scheme = (Guid)Marshal.PtrToStructure(ptr, typeof(Guid)); SystemPowerSetting ps = SystemPowerSettings[(int)settingType]; if (AC) success = PowerReadACValueIndex(IntPtr.Zero, ref scheme, ref ps.subgroupGuid, ref ps.settingGuid, ref value); else success = PowerReadDCValueIndex(IntPtr.Zero, ref scheme, ref ps.subgroupGuid, ref ps.settingGuid, ref value); if (success == 0) return (int)value; return -1; } catch (Exception) { return -1; } }
/// <summary> /// Set system power setting value for indicated power status /// </summary> /// <param name="settingType"></param> /// <param name="AC"></param> /// <param name="value"></param> private static void SetSystemPowerSetting(SystemPowerSettingType settingType, bool AC, uint value) { try { IntPtr ptr = IntPtr.Zero; PowerGetActiveScheme(IntPtr.Zero, ref ptr); Guid scheme = (Guid)Marshal.PtrToStructure(ptr, typeof(Guid)); SystemPowerSetting ps = SystemPowerSettings[(int)settingType]; if (AC) PowerWriteACValueIndex(IntPtr.Zero, ref scheme, ref ps.subgroupGuid, ref ps.settingGuid, value); else PowerWriteDCValueIndex(IntPtr.Zero, ref scheme, ref ps.subgroupGuid, ref ps.settingGuid, value); } catch (Exception) { } }
/// <summary> /// Set power setting value (OS independent) /// </summary> /// <param name="settingType"></param> /// <param name="AC"></param> /// <param name="value"></param> public static void SetPowerSetting(SystemPowerSettingType settingType, bool AC, uint value) { if (Environment.OSVersion.Version.Major >= 6) SetSystemPowerSetting(settingType, AC, value); else SetPowerPolicySetting(settingType, AC, value); }
/// <summary> /// Get power setting value for indicated power status (OS independent) /// </summary> /// <param name="settingType"></param> /// <param name="AC"></param> /// <returns>Returns value of power setting requested. Returns 0 on errors.</returns> public static int GetPowerSetting(SystemPowerSettingType settingType, bool AC) { if (Environment.OSVersion.Version.Major >= 6) return GetSystemPowerSetting(settingType, AC); else return GetPowerPolicySetting(settingType, AC); }
/// <summary> /// Get power setting value for active power status (OS independent) /// </summary> /// <param name="settingType"></param> /// <returns>Returns value of power setting requested. Returns 0 on errors.</returns> public static int GetActivePowerSetting(SystemPowerSettingType settingType) { if (Environment.OSVersion.Version.Major >= 6) return GetSystemPowerSetting(settingType, ACPowerPluggedIn); else return GetPowerPolicySetting(settingType, ACPowerPluggedIn); }
/// <summary> /// Set power policy setting value for indicated power status (Windows XP) /// </summary> /// <param name="settingType"></param> /// <param name="AC"></param> /// <param name="value"></param> private static void SetPowerPolicySetting(SystemPowerSettingType settingType, bool AC, uint value) { try { GLOBAL_POWER_POLICY gpp = new GLOBAL_POWER_POLICY(); POWER_POLICY pp = new POWER_POLICY(); UInt32 index = 0; POWER_ACTION action; PowerActionEventCode eventCode; if (!GetCurrentPowerPolicies(ref gpp, ref pp)) return; GetActivePwrScheme(ref index); switch (settingType) { case SystemPowerSettingType.STANDBYIDLE: if (AC) { pp.user.IdleTimeoutAc = value; if (value == 0 && pp.mach.DozeS4TimeoutAc != 0) pp.user.IdleAc.Action = POWER_ACTION.PowerActionHibernate; else pp.user.IdleAc.Action = POWER_ACTION.PowerActionSleep; } else { pp.user.IdleTimeoutDc = value; if (value == 0 && pp.mach.DozeS4TimeoutDc != 0) pp.user.IdleDc.Action = POWER_ACTION.PowerActionHibernate; else pp.user.IdleDc.Action = POWER_ACTION.PowerActionSleep; } break; case SystemPowerSettingType.HIBERNATE_AFTER: if (AC) { if (pp.user.IdleTimeoutAc == 0) { pp.user.IdleTimeoutAc = value; pp.mach.DozeS4TimeoutAc = 0; pp.user.IdleAc.Action = POWER_ACTION.PowerActionHibernate; } else { if (value > pp.user.IdleTimeoutAc) pp.mach.DozeS4TimeoutAc = value - pp.user.IdleTimeoutAc; else pp.mach.DozeS4TimeoutAc = value; pp.user.IdleAc.Action = POWER_ACTION.PowerActionSleep; } } else { if (pp.user.IdleTimeoutDc == 0) { pp.user.IdleTimeoutDc = value; pp.mach.DozeS4TimeoutDc = 0; pp.user.IdleDc.Action = POWER_ACTION.PowerActionHibernate; } else { if (value > pp.user.IdleTimeoutDc) pp.mach.DozeS4TimeoutDc = value - pp.user.IdleTimeoutDc; else pp.mach.DozeS4TimeoutDc = value; pp.user.IdleDc.Action = POWER_ACTION.PowerActionSleep; } } break; case SystemPowerSettingType.LID_CLOSE_ACTION: eventCode = 0; switch (value) { case 0: // Do nothing action = POWER_ACTION.PowerActionNone; eventCode = PowerActionEventCode.POWER_FORCE_TRIGGER_RESET; break; case 1: // Sleep action = POWER_ACTION.PowerActionSleep; break; case 2: // Hibernate action = POWER_ACTION.PowerActionHibernate; break; case 3: // Shutdown action = POWER_ACTION.PowerActionNone; eventCode = PowerActionEventCode.POWER_USER_NOTIFY_SHUTDOWN; break; case 4: // Ask User action = POWER_ACTION.PowerActionNone; eventCode = PowerActionEventCode.POWER_USER_NOTIFY_BUTTON; break; default: return; } if (AC) { gpp.user.LidCloseAc.Action = action; gpp.user.LidCloseAc.EventCode = eventCode; } else { gpp.user.LidCloseDc.Action = action; gpp.user.LidCloseDc.EventCode = eventCode; } break; case SystemPowerSettingType.POWER_BUTTON_ACTION: eventCode = 0; switch (value) { case 0: // Do nothing action = POWER_ACTION.PowerActionNone; eventCode = PowerActionEventCode.POWER_FORCE_TRIGGER_RESET; break; case 1: // Sleep action = POWER_ACTION.PowerActionSleep; break; case 2: // Hibernate action = POWER_ACTION.PowerActionHibernate; break; case 3: // Shutdown action = POWER_ACTION.PowerActionNone; eventCode = PowerActionEventCode.POWER_USER_NOTIFY_SHUTDOWN; break; case 4: // Ask User action = POWER_ACTION.PowerActionNone; eventCode = PowerActionEventCode.POWER_USER_NOTIFY_BUTTON; break; default: return; } if (AC) { gpp.user.PowerButtonAc.Action = action; gpp.user.PowerButtonAc.EventCode = eventCode; } else { gpp.user.PowerButtonDc.Action = action; gpp.user.PowerButtonDc.EventCode = eventCode; } break; case SystemPowerSettingType.SLEEP_BUTTON_ACTION: eventCode = 0; switch (value) { case 0: // Do nothing action = POWER_ACTION.PowerActionNone; eventCode = PowerActionEventCode.POWER_FORCE_TRIGGER_RESET; break; case 1: // Sleep action = POWER_ACTION.PowerActionSleep; break; case 2: // Hibernate action = POWER_ACTION.PowerActionHibernate; break; case 3: // Shutdown action = POWER_ACTION.PowerActionNone; eventCode = PowerActionEventCode.POWER_USER_NOTIFY_SHUTDOWN; break; case 4: // Ask User action = POWER_ACTION.PowerActionNone; eventCode = PowerActionEventCode.POWER_USER_NOTIFY_BUTTON; break; default: return; } if (AC) { gpp.user.SleepButtonAc.Action = action; gpp.user.SleepButtonAc.EventCode = eventCode; } else { gpp.user.SleepButtonDc.Action = action; gpp.user.SleepButtonDc.EventCode = eventCode; } break; default: return; } SetActivePwrScheme(index, ref gpp, ref pp); } catch (Exception) { } }
/// <summary> /// Get power policy setting for indicated power status (Windows XP) /// </summary> /// <param name="settingType">Returns value of power setting requested. Returns -1 on errors.</param> /// <returns></returns> private static int GetPowerPolicySetting(SystemPowerSettingType settingType, bool AC) { try { GLOBAL_POWER_POLICY gpp = new GLOBAL_POWER_POLICY(); POWER_POLICY pp = new POWER_POLICY(); POWER_ACTION action; PowerActionEventCode eventCode; if (!GetCurrentPowerPolicies(ref gpp, ref pp)) { return -1; } switch (settingType) { case SystemPowerSettingType.STANDBYIDLE: if (AC) { if (pp.user.IdleAc.Action == POWER_ACTION.PowerActionSleep) return (int)pp.user.IdleTimeoutAc; } else { if (pp.user.IdleDc.Action == POWER_ACTION.PowerActionSleep) return (int)pp.user.IdleTimeoutDc; } return 0; case SystemPowerSettingType.HIBERNATE_AFTER: if (AC) { if (pp.user.IdleAc.Action == POWER_ACTION.PowerActionHibernate) return (int)pp.user.IdleTimeoutAc; if (pp.mach.DozeS4TimeoutAc != 0) return (int)(pp.mach.DozeS4TimeoutAc + pp.user.IdleTimeoutAc); } else { if (pp.user.IdleDc.Action == POWER_ACTION.PowerActionHibernate) return (int)pp.user.IdleTimeoutDc; if (pp.mach.DozeS4TimeoutDc != 0) return (int)(pp.mach.DozeS4TimeoutDc + pp.user.IdleTimeoutDc); } return 0; case SystemPowerSettingType.LID_CLOSE_ACTION: if (AC) { action = gpp.user.LidCloseAc.Action; eventCode = gpp.user.LidCloseAc.EventCode; } else { action = gpp.user.LidCloseDc.Action; eventCode = gpp.user.LidCloseDc.EventCode; } switch (action) { case POWER_ACTION.PowerActionSleep: return 1; // Sleep case POWER_ACTION.PowerActionHibernate: return 2; // Hibernate default: if ((eventCode & PowerActionEventCode.POWER_USER_NOTIFY_SHUTDOWN) != 0) return 3; // Shutdown if ((eventCode & PowerActionEventCode.POWER_USER_NOTIFY_BUTTON) != 0) return 4; // Ask User return 0; //Do nothing } case SystemPowerSettingType.POWER_BUTTON_ACTION: if (AC) { action = gpp.user.PowerButtonAc.Action; eventCode = gpp.user.PowerButtonAc.EventCode; } else { action = gpp.user.PowerButtonDc.Action; eventCode = gpp.user.PowerButtonDc.EventCode; } switch (action) { case POWER_ACTION.PowerActionSleep: return 1; // Sleep case POWER_ACTION.PowerActionHibernate: return 2; // Hibernate default: if ((eventCode & PowerActionEventCode.POWER_USER_NOTIFY_SHUTDOWN) != 0) return 3; // Shutdown if ((eventCode & PowerActionEventCode.POWER_USER_NOTIFY_BUTTON) != 0) return 4; // Ask User return 0; //Do nothing } case SystemPowerSettingType.SLEEP_BUTTON_ACTION: if (AC) { action = gpp.user.SleepButtonAc.Action; eventCode = gpp.user.SleepButtonAc.EventCode; } else { action = gpp.user.SleepButtonDc.Action; eventCode = gpp.user.SleepButtonDc.EventCode; } switch (action) { case POWER_ACTION.PowerActionSleep: return 1; // Sleep case POWER_ACTION.PowerActionHibernate: return 2; // Hibernate default: if ((eventCode & PowerActionEventCode.POWER_USER_NOTIFY_SHUTDOWN) != 0) return 3; // Shutdown if ((eventCode & PowerActionEventCode.POWER_USER_NOTIFY_BUTTON) != 0) return 4; // Ask User return 0; //Do nothing } default: return 0; } } catch (Exception) { return -1; } }