/// <summary> /// Transforms a Window/Service Message to PowerEventInfo /// </summary> public static PowerEventInfo TransformMessage(ref Message m) { if (m.Msg == WM_POWERBROADCAST) { switch ((int)m.WParam) { case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMBATTERYLOW: return(new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }); case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMOEMEVENT: return(new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam), OEMEventCode = (int)m.LParam }); case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMPOWERSTATUSCHANGE: { var pei = new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }; SYSTEM_POWER_STATUS sps = new SYSTEM_POWER_STATUS(); if (GetSystemPowerStatus(out sps)) { pei.SYSTEM_POWER_STATUS = sps; } return(pei); } case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMQUERYSTANDBY: return(new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }); case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMQUERYSTANDBYFAILED: return(new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }); case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMQUERYSUSPEND: return(new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }); case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMQUERYSUSPENDFAILED: return(new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }); case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMRESUMEAUTOMATIC: return(new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }); case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMRESUMECRITICAL: return(new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }); case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMRESUMESTANDBY: return(new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }); case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMRESUMESUSPEND: return(new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }); case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMSTANDBY: return(new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }); case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMSUSPEND: return(new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }); case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_POWERSETTINGCHANGE: { var pei = new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }; POWERBROADCAST_SETTING ps = (POWERBROADCAST_SETTING)Marshal.PtrToStructure(m.LParam, typeof(POWERBROADCAST_SETTING)); IntPtr pData = (IntPtr)(m.LParam.ToInt32() + Marshal.SizeOf(ps)); // (*1) if (ps.PowerSetting == PowerSettings.GUID_POWERSCHEME_PERSONALITY && ps.DataLength == Marshal.SizeOf(typeof(Guid))) { Guid newPersonality = (Guid)Marshal.PtrToStructure(pData, typeof(Guid)); if (newPersonality == PowerSettings.GUID_MAX_POWER_SAVINGS) { pei.PowerSavingsMode = PowerSavings.Max; } else if (newPersonality == PowerSettings.GUID_MIN_POWER_SAVINGS) { pei.PowerSavingsMode = PowerSavings.Min; } else if (newPersonality == PowerSettings.GUID_TYPICAL_POWER_SAVINGS) { pei.PowerSavingsMode = PowerSavings.Typical; } else { DebugLogger.WriteLine("switched to unknown Power savings"); } } else if (ps.PowerSetting == PowerSettings.GUID_ACDC_POWER_SOURCE && ps.DataLength == Marshal.SizeOf(typeof(Int32))) { Int32 iData = (Int32)Marshal.PtrToStructure(pData, typeof(Int32)); DebugLogger.WriteLine("ACDC: " + (PoweredBy)iData); pei.PoweredBy = (PoweredBy)iData; //onBattery = iData != 0; } else if (ps.PowerSetting == PowerSettings.GUID_ACTIVE_POWERSCHEME && ps.DataLength == Marshal.SizeOf(typeof(Guid))) { Guid schemeId = (Guid)Marshal.PtrToStructure(pData, typeof(Guid)); pei.CurrentPowerSchemeId = schemeId; pei.CurrentPowerScheme = ReadPowerSchemeFriendlyName(schemeId); } else if ((ps.PowerSetting == PowerSettings.GUID_CONSOLE_DISPLAY_STATE || ps.PowerSetting == PowerSettings.GUID_MONITOR_POWER_ON) && ps.DataLength == Marshal.SizeOf(typeof(Int32))) { Int32 iData = (Int32)Marshal.PtrToStructure(pData, typeof(Int32)); DebugLogger.WriteLine("monitor's display state: " + (MonitorDisplayState)iData); pei.CurrentMonitorDisplayState = (MonitorDisplayState)iData; } else if (ps.PowerSetting == PowerSettings.GUID_IDLE_BACKGROUND_TASK) { pei.Idle = DateTime.UtcNow; } else if (ps.PowerSetting == PowerSettings.GUID_BATTERY_PERCENTAGE_REMAINING) { Int32 iData = (Int32)Marshal.PtrToStructure(pData, typeof(Int32)); DebugLogger.WriteLine("Battery Power Remaining: " + iData); pei.BatteryPowerRemaining = iData; } else if (ps.PowerSetting == PowerSettings.GUID_LIDSWITCH_STATE_CHANGE) { Int32 iData = (Int32)Marshal.PtrToStructure(pData, typeof(Int32)); DebugLogger.WriteLine("Lid Open: " + iData); pei.LidOpen = (iData == 1); } else { DebugLogger.WriteLine("Unknown power setting {0}", ps.PowerSetting); } return(pei); } } } DebugLogger.WriteLine("Unhandled Power notification " + m.ToString()); return(null); }
/// <summary> /// Transforms a Window/Service Message to PowerEventInfo /// </summary> public static PowerEventInfo TransformMessage(ref Message m) { if (m.Msg == WM_POWERBROADCAST) { switch ((int)m.WParam) { case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMBATTERYLOW: return new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }; case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMOEMEVENT: return new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam), OEMEventCode = (int)m.LParam }; case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMPOWERSTATUSCHANGE: { var pei = new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }; SYSTEM_POWER_STATUS sps = new SYSTEM_POWER_STATUS(); if (GetSystemPowerStatus(out sps)) { pei.SYSTEM_POWER_STATUS = sps; } return pei; } case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMQUERYSTANDBY: return new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }; case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMQUERYSTANDBYFAILED: return new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }; case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMQUERYSUSPEND: return new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }; case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMQUERYSUSPENDFAILED: return new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }; case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMRESUMEAUTOMATIC: return new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }; case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMRESUMECRITICAL: return new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }; case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMRESUMESTANDBY: return new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }; case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMRESUMESUSPEND: return new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }; case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMSTANDBY: return new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }; case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_APMSUSPEND: return new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }; case (int)ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control.PBT_POWERSETTINGCHANGE: { var pei = new PowerEventInfo { PowerEvent = (ServicesAPI.SERVICE_CONTROL_POWEREVENT_Control)(int)(m.WParam) }; POWERBROADCAST_SETTING ps = (POWERBROADCAST_SETTING)Marshal.PtrToStructure(m.LParam, typeof(POWERBROADCAST_SETTING)); IntPtr pData = (IntPtr)(m.LParam.ToInt32() + Marshal.SizeOf(ps)); // (*1) if (ps.PowerSetting == PowerSettings.GUID_POWERSCHEME_PERSONALITY && ps.DataLength == Marshal.SizeOf(typeof(Guid))) { Guid newPersonality = (Guid)Marshal.PtrToStructure(pData, typeof(Guid)); if (newPersonality == PowerSettings.GUID_MAX_POWER_SAVINGS) { pei.PowerSavingsMode = PowerSavings.Max; } else if (newPersonality == PowerSettings.GUID_MIN_POWER_SAVINGS) { pei.PowerSavingsMode = PowerSavings.Min; } else if (newPersonality == PowerSettings.GUID_TYPICAL_POWER_SAVINGS) { pei.PowerSavingsMode = PowerSavings.Typical; } else { DebugLogger.WriteLine("switched to unknown Power savings"); } } else if (ps.PowerSetting == PowerSettings.GUID_ACDC_POWER_SOURCE && ps.DataLength == Marshal.SizeOf(typeof(Int32))) { Int32 iData = (Int32)Marshal.PtrToStructure(pData, typeof(Int32)); DebugLogger.WriteLine("ACDC: " + (PoweredBy)iData); pei.PoweredBy = (PoweredBy)iData; //onBattery = iData != 0; } else if (ps.PowerSetting == PowerSettings.GUID_ACTIVE_POWERSCHEME && ps.DataLength == Marshal.SizeOf(typeof(Guid))) { Guid schemeId = (Guid)Marshal.PtrToStructure(pData, typeof(Guid)); pei.CurrentPowerSchemeId = schemeId; pei.CurrentPowerScheme = ReadPowerSchemeFriendlyName(schemeId); } else if ((ps.PowerSetting == PowerSettings.GUID_CONSOLE_DISPLAY_STATE || ps.PowerSetting == PowerSettings.GUID_MONITOR_POWER_ON) && ps.DataLength == Marshal.SizeOf(typeof(Int32))) { Int32 iData = (Int32)Marshal.PtrToStructure(pData, typeof(Int32)); DebugLogger.WriteLine("monitor's display state: " + (MonitorDisplayState)iData); pei.CurrentMonitorDisplayState = (MonitorDisplayState)iData; } else if (ps.PowerSetting == PowerSettings.GUID_IDLE_BACKGROUND_TASK) { pei.Idle = DateTime.UtcNow; } else if (ps.PowerSetting == PowerSettings.GUID_BATTERY_PERCENTAGE_REMAINING) { Int32 iData = (Int32)Marshal.PtrToStructure(pData, typeof(Int32)); DebugLogger.WriteLine("Battery Power Remaining: " + iData); pei.BatteryPowerRemaining = iData; } else if (ps.PowerSetting == PowerSettings.GUID_LIDSWITCH_STATE_CHANGE) { Int32 iData = (Int32)Marshal.PtrToStructure(pData, typeof(Int32)); DebugLogger.WriteLine("Lid Open: " + iData); pei.LidOpen = (iData == 1); } else { DebugLogger.WriteLine("Unknown power setting {0}", ps.PowerSetting); } return pei; } } } DebugLogger.WriteLine("Unhandled Power notification " + m.ToString()); return null; }