Example #1
0
        /// <summary>
        ///  获取系统电量百分比
        /// </summary>
        /// <returns></returns>
        public static float GetSystemPower()
        {
            SYSTEM_POWER_STATUS SysPower = new SYSTEM_POWER_STATUS();

            GetSystemPowerStatus(ref SysPower);

            return(SysPower.BatteryLifePercent);
        }
Example #2
0
        static void Main(string[] args)
        {
            Console.Title = "Easy to find title!";

            IntPtr hWnd = FindWindow(null, "Easy to find title!");

            // Hide the console
            if (hWnd != IntPtr.Zero)
            {
                ShowWindow(hWnd, 0);
            }

            // The system power charger struct
            SYSTEM_POWER_STATUS status = new SYSTEM_POWER_STATUS();

            int current = 0;
            int last    = 0;

            while (true)
            {
                System.Threading.Thread.Sleep(100);

                // Get Power status from Kernell
                GetSystemPowerStatus(ref status);

                // Set current to the current status
                current = status.ACLineStatus;

                // If the state has changed since last check
                if (current != last)
                {
                    // 0 = AC disconnected
                    // 1 = AC connected
                    switch (current)
                    {
                    case 0:
                        (new SoundPlayer("sound\\doh.wav")).Play();
                        break;

                    case 1:
                        (new SoundPlayer("sound\\woohoo.wav")).Play();
                        break;

                    default:
                        // Probably not an laptop or there's an error. Just quit
                        System.Windows.Forms.MessageBox.Show("Error! Can't get the status");
                        return;

                        break;
                    }
                }

                last = current; // set last to current
            }
        }
Example #3
0
        static void Main(string[] args)
        {
            Console.Title = "Easy to find title!";

            IntPtr hWnd = FindWindow(null, "Easy to find title!");

            // Hide the console
            if (hWnd != IntPtr.Zero)
                ShowWindow(hWnd, 0);

            // The system power charger struct
            SYSTEM_POWER_STATUS status = new SYSTEM_POWER_STATUS();

            int current = 0;
            int last = 0;

            while (true)
            {
                System.Threading.Thread.Sleep(100);

                // Get Power status from Kernell
                GetSystemPowerStatus(ref status);

                // Set current to the current status
                current = status.ACLineStatus;

                // If the state has changed since last check
                if (current != last)
                {
                    // 0 = AC disconnected
                    // 1 = AC connected
                    switch(current)
                    {
                        case 0:
                            (new SoundPlayer("sound\\doh.wav")).Play();
                            break;

                        case 1:
                            (new SoundPlayer("sound\\woohoo.wav")).Play();
                            break;

                        default:
                            // Probably not an laptop or there's an error. Just quit
                            System.Windows.Forms.MessageBox.Show("Error! Can't get the status");
                            return;
                            break;
                    }
                }

                last = current; // set last to current
            }
        }
Example #4
0
        private void BatteryForm_Load(object sender, EventArgs e)
        {
            System.Diagnostics.Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
            netData.Max = 1000000;
            powerStatus = new SYSTEM_POWER_STATUS();

            DoAsync async = new DoAsync(GetBatteryDetails);

            async.BeginInvoke(null, null);

            //define a thread to add values into chart
            ThreadStart addDataThreadStart = new ThreadStart(AddDataThreadLoop);

            addDataRunner = new Thread(addDataThreadStart);
            addDataDel   += new AddDataDelegate(AddData);
            //add series into chart
            startTrending_Click(null, new EventArgs());

            t = new System.Windows.Forms.Timer {
                Enabled = true, Interval = 1000
            };
            t.Tick += t_Tick;
            powerSource.TextChanged += new EventHandler(this.t_Tick);

            metroComboBox1.Items.Add("Monitor");
            metroComboBox1.Items.Add("Fan");
            metroComboBox1.Items.Add("Heat pipe");
            metroComboBox1.Items.Add("Refrigeration");
            metroComboBox1.Items.Add("TemperatureProbe");
            metroComboBox1.Items.Add("CDROM Drive");
            metroComboBox1.Items.Add("Disk Drive");
            metroComboBox1.Items.Add("Floppy Drive");
            metroComboBox1.Items.Add("Tape Drive");
            metroComboBox1.Items.Add("Mother Board");
            metroComboBox1.Items.Add("USB Hub");
            metroComboBox1.Items.Add("Network adapter");
            metroComboBox1.Items.Add("Voltage Probe");
            metroComboBox1.Items.Add("Printer");
            metroComboBox1.Items.Add("Processor");

            this.metroComboBox1.SelectedIndexChanged +=
                new System.EventHandler(metroComboBox1_SelectedIndexChanged);
        }
Example #5
0
                /// <summary>
                /// 读取交流电源线的连接状态
                /// </summary>
                /// <returns></returns>
                public static string ReadAlternatingCurrentConnectState()
        {
            string AlternatingCurrentConnectState = ""; //交流供电情况
                                                        //申明一个结构对象,通过引用将值传到这个对象
                        SYSTEM_POWER_STATUS SysPower = new SYSTEM_POWER_STATUS();

            GetSystemPowerStatus(ref SysPower);
            if (SysPower.ACLineStatus == 1)
            {//处于在线状态
                                AlternatingCurrentConnectState = "Online";
            }
            else if (SysPower.ACLineStatus == 0)
            {//处于离线状态
                                AlternatingCurrentConnectState = "Offline";
            }
            else
            {//未知状态
                                AlternatingCurrentConnectState = "UnKnown";
            }
            return(AlternatingCurrentConnectState);
        }
 private static extern bool GetSystemPowerStatus(
     out SYSTEM_POWER_STATUS systemPowerStatus);
Example #7
0
 internal extern static bool GetSystemPowerStatus(SYSTEM_POWER_STATUS SystemPowerStatus);
Example #8
0
 [DllImport("kernel32.dll", EntryPoint = "GetSystemPowerStatus")]   //win32 api
 private static extern void GetSystemPowerStatus(ref SYSTEM_POWER_STATUS lpSystemPowerStatus);
Example #9
0
 public static extern BOOL GetSystemPowerStatus(ref SYSTEM_POWER_STATUS lpSystemPowerStatus);
 public static partial BOOL GetSystemPowerStatus(ref SYSTEM_POWER_STATUS lpSystemPowerStatus);
Example #11
0
 public static extern bool GetSystemPowerStatus(out SYSTEM_POWER_STATUS lpSystemPowerStatus);
Example #12
0
 internal extern static bool GetSystemPowerStatus(SYSTEM_POWER_STATUS SystemPowerStatus);
 public static SYSTEM_POWER_STATUS GetStatus()
 {
     SYSTEM_POWER_STATUS SPS = new SYSTEM_POWER_STATUS();
     GetSystemPowerStatus(ref SPS);
     return SPS;
 }
Example #14
0
 internal static extern bool GetSystemPowerStatus(out SYSTEM_POWER_STATUS systemPowerStatus);
        private void UpdateDynamicSystemData()
        {
            DynamicSystemData = new DynamicSystemInfo();

            try
            {
                MEMORYSTATUSEX memoryStatus = new MEMORYSTATUSEX();
                GlobalMemoryStatusEx(memoryStatus);
                DynamicSystemData.PhysicalMemory       = $"total = {memoryStatus.ullTotalPhys / GB:N2} GB, available = {memoryStatus.ullAvailPhys / GB:N2} GB";
                DynamicSystemData.PhysicalPlusPagefile = $"total = {memoryStatus.ullTotalPageFile / GB:N2} GB, available = {memoryStatus.ullAvailPageFile / GB:N2} GB";
                DynamicSystemData.VirtualMemory        = $"total = {memoryStatus.ullTotalVirtual / GB:N2} GB, available = {memoryStatus.ullAvailVirtual / GB:N2} GB";
                ulong pageFileOnDisk = memoryStatus.ullTotalPageFile - memoryStatus.ullTotalPhys;
                DynamicSystemData.PagefileOnDisk = $"{pageFileOnDisk / GB:N2} GB";
                DynamicSystemData.MemoryLoad     = $"{memoryStatus.dwMemoryLoad}%";
            }
            catch (Exception ex)
            {
                App.AnalyticsWriteLine("MainPage.UpdateDynamicSystemData", "MEMORYSTATUSEX", ex.Message);
            }

            bool isBatteryAvailable = true;

            try
            {
                SYSTEM_POWER_STATUS powerStatus = new SYSTEM_POWER_STATUS();
                GetSystemPowerStatus(ref powerStatus);
                DynamicSystemData.ACLineStatus = powerStatus.ACLineStatus.ToString();

                DynamicSystemData.BatteryChargeStatus = $"{powerStatus.BatteryChargeStatus:G}";
                if (powerStatus.BatteryChargeStatus == BatteryFlag.NoSystemBattery ||
                    powerStatus.BatteryChargeStatus == BatteryFlag.Unknown)
                {
                    isBatteryAvailable            = false;
                    DynamicSystemData.BatteryLife = "n/a";
                }
                else
                {
                    DynamicSystemData.BatteryLife = $"{powerStatus.BatteryLifePercent}%";
                }
                DynamicSystemData.BatterySaver = powerStatus.BatterySaver.ToString();
            }
            catch (Exception ex)
            {
                App.AnalyticsWriteLine("MainPage.UpdateDynamicSystemData", "SYSTEM_POWER_STATUS", ex.Message);
            }

            if (isBatteryAvailable)
            {
                try
                {
                    Battery       battery       = Battery.AggregateBattery;
                    BatteryReport batteryReport = battery.GetReport();
                    DynamicSystemData.ChargeRate = $"{batteryReport.ChargeRateInMilliwatts:N0} mW";
                    DynamicSystemData.Capacity   =
                        $"design = {batteryReport.DesignCapacityInMilliwattHours:N0} mWh, " +
                        $"full = {batteryReport.FullChargeCapacityInMilliwattHours:N0} mWh, " +
                        $"remaining = {batteryReport.RemainingCapacityInMilliwattHours:N0} mWh";
                }
                catch (Exception ex)
                {
                    App.AnalyticsWriteLine("MainPage.UpdateDynamicSystemData", "BatteryReport", ex.Message);
                }
            }
            else
            {
                DynamicSystemData.ChargeRate = "n/a";
                DynamicSystemData.Capacity   = "n/a";
            }

            try
            {
                ulong freeBytesAvailable;
                ulong totalNumberOfBytes;
                ulong totalNumberOfFreeBytes;

                // You can only specify a folder path that this app can access, but you can
                // get full disk information from any folder path.
                IStorageFolder appFolder = ApplicationData.Current.LocalFolder;
                GetDiskFreeSpaceEx(appFolder.Path, out freeBytesAvailable, out totalNumberOfBytes, out totalNumberOfFreeBytes);
                DynamicSystemData.TotalDiskSize = $"{totalNumberOfBytes / GB:N2} GB";
                DynamicSystemData.DiskFreeSpace = $"{freeBytesAvailable / GB:N2} GB";
            }
            catch (Exception ex)
            {
                App.AnalyticsWriteLine("MainPage.UpdateDynamicSystemData", "GetDiskFreeSpaceEx", ex.Message);
            }

            try
            {
                IntPtr infoPtr = IntPtr.Zero;
                uint   infoLen = (uint)Marshal.SizeOf <FIXED_INFO>();
                int    ret     = -1;

                while (ret != ERROR_SUCCESS)
                {
                    infoPtr = Marshal.AllocHGlobal(Convert.ToInt32(infoLen));
                    ret     = GetNetworkParams(infoPtr, ref infoLen);
                    if (ret == ERROR_BUFFER_OVERFLOW)
                    {
                        // Try again with a bigger buffer.
                        Marshal.FreeHGlobal(infoPtr);
                        continue;
                    }
                }

                FIXED_INFO info = Marshal.PtrToStructure <FIXED_INFO>(infoPtr);
                DynamicSystemData.DomainName = info.DomainName;

                string nodeType = string.Empty;
                switch (info.NodeType)
                {
                case BROADCAST_NODETYPE:
                    nodeType = "Broadcast";
                    break;

                case PEER_TO_PEER_NODETYPE:
                    nodeType = "Peer to Peer";
                    break;

                case MIXED_NODETYPE:
                    nodeType = "Mixed";
                    break;

                case HYBRID_NODETYPE:
                    nodeType = "Hybrid";
                    break;

                default:
                    nodeType = $"Unknown ({info.NodeType})";
                    break;
                }
                DynamicSystemData.NodeType = nodeType;
            }
            catch (Exception ex)
            {
                App.AnalyticsWriteLine("MainPage.UpdateDynamicSystemData", "GetNetworkParams", ex.Message);
            }

            try
            {
                ConnectionProfile profile = NetworkInformation.GetInternetConnectionProfile();
                DynamicSystemData.ConnectedProfile = profile.ProfileName;

                NetworkAdapter internetAdapter = profile.NetworkAdapter;
                DynamicSystemData.IanaInterfaceType = $"{(IanaInterfaceType)internetAdapter.IanaInterfaceType}";
                DynamicSystemData.InboundSpeed      = $"{internetAdapter.InboundMaxBitsPerSecond / MBPS:N0} Mbps";
                DynamicSystemData.OutboundSpeed     = $"{internetAdapter.OutboundMaxBitsPerSecond / MBPS:N0} Mbps";

                IReadOnlyList <HostName> hostNames = NetworkInformation.GetHostNames();
                HostName connectedHost             = hostNames.Where
                                                         (h => h.IPInformation != null &&
                                                         h.IPInformation.NetworkAdapter != null &&
                                                         h.IPInformation.NetworkAdapter.NetworkAdapterId == internetAdapter.NetworkAdapterId)
                                                     .FirstOrDefault();
                if (connectedHost != null)
                {
                    DynamicSystemData.HostAddress = connectedHost.CanonicalName;
                    DynamicSystemData.AddressType = connectedHost.Type.ToString();
                }
            }
            catch (Exception ex)
            {
                App.AnalyticsWriteLine("MainPage.UpdateDynamicSystemData", "GetInternetConnectionProfile", ex.Message);
            }

            dynamicDataGrid.DataContext = DynamicSystemData;
        }
Example #16
0
 public static extern bool GetSystemPowerStatus([In, Out] ref SYSTEM_POWER_STATUS systemPowerStatus);
Example #17
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;
        }
 private static extern int GetSystemPowerStatus(ref SYSTEM_POWER_STATUS lpSystemPowerStatus);