Esempio n. 1
0
        /// <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;
        }