Ejemplo n.º 1
0
 public PowerStatusConfiguration(PowerStatusChoice chosenstatus, BatteryChargeStatus chosenBCS, int percentage)
 {
     ChosenStatus = chosenstatus;
     Percentage   = percentage;
     ChosenBCS    = chosenBCS;
     InitializeComponent();
 }
Ejemplo n.º 2
0
 /// <summary>
 /// Initializes a new instance of MachineStatus
 /// </summary>
 /// <param name="ip">IP Address of the monitored device</param>
 /// <param name="blf">The remaining Battery Life Percentage</param>
 /// <param name="bcs">the Battery Charge Status</param>
 /// <param name="cpu">The Average CPU usage percentage</param>
 /// <param name="mem">The Average Memory usage percentage</param>
 /// <param name="disk">The percentage of free space in the deault HDD</param>
 /// <param name="info">Sores aditional info</param>
 internal MachineStatus(IPAddress ip, int blf, BatteryChargeStatus bcs, int cpu, int mem, int disk, string info)
 {
     this.ip = ip;
     this.batteryLifePercent  = blf;
     this.batteryChargeStatus = bcs;
     if ((cpu > 100) || (cpu < -1))
     {
         throw new ArgumentOutOfRangeException("cpu");
     }
     if ((mem > 100) || (mem < -1))
     {
         throw new ArgumentOutOfRangeException("mem");
     }
     if ((disk > 100) || (disk < -1))
     {
         throw new ArgumentOutOfRangeException("disk");
     }
     this.cpu    = cpu;
     this.memory = mem;
     this.disk   = disk;
     if (info == null)
     {
         info = "";
     }
     else
     {
         this.info = info.Trim();
     }
 }
Ejemplo n.º 3
0
		internal PowerStatus (BatteryChargeStatus batteryChargeStatus, int batteryFullLifetime, float batteryLifePercent, int batteryLifeRemaining, PowerLineStatus powerLineStatus)
		{
			this.battery_charge_status = batteryChargeStatus;
			this.battery_full_lifetime = batteryFullLifetime;
			this.battery_life_percent = batteryLifePercent;
			this.battery_life_remaining = batteryLifeRemaining;
			this.power_line_status = powerLineStatus;
		}
Ejemplo n.º 4
0
        public void OnSaved(WpfConfiguration configurationControl)
        {
            var config = (PowerStatusConfiguration)configurationControl;

            chosenStatus = config.ChosenStatus;
            chosenBCS    = config.ChosenBCS;
            percentage   = config.Percentage;
        }
Ejemplo n.º 5
0
        public TimeData(DateTime time)
        {
            noData    = true;
            this.time = time;

            charger = PowerLineStatus.Unknown;
            status  = BatteryChargeStatus.Unknown;
        }
Ejemplo n.º 6
0
        private void ProcessMessage(string message)
        {
            string[]            info    = message.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
            BatteryChargeStatus status  = (BatteryChargeStatus)Enum.Parse(typeof(BatteryChargeStatus), info[1]);
            PowerLineStatus     charger = (PowerLineStatus)Enum.Parse(typeof(PowerLineStatus), info[2]);

            ApplicationStartup.UpdateIcon(int.Parse(info[0]), status, charger);
        }
Ejemplo n.º 7
0
 internal PowerStatus(BatteryChargeStatus batteryChargeStatus, int batteryFullLifetime, float batteryLifePercent, int batteryLifeRemaining, PowerLineStatus powerLineStatus)
 {
     this.battery_charge_status  = batteryChargeStatus;
     this.battery_full_lifetime  = batteryFullLifetime;
     this.battery_life_percent   = batteryLifePercent;
     this.battery_life_remaining = batteryLifeRemaining;
     this.power_line_status      = powerLineStatus;
 }
Ejemplo n.º 8
0
        public TimeData(DateTime date, string line)
        {
            string[] data = line.Split(new char[] { ';', '=' });
            data[0] = FixNumeric(data[0]);
            time    = date.Add(TimeSpan.Parse(data[0]));

            percentage = Convert.ToInt32(data[1]);
            status     = (BatteryChargeStatus)Enum.Parse(typeof(BatteryChargeStatus), data[2]);
            charger    = (PowerLineStatus)Enum.Parse(typeof(PowerLineStatus), data[3]);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// <para>Returns the current Power status</para>
        /// </summary>
        /// <returns></returns>
        public static TreeNode GetStatus()
        {
            TreeNode tnMain = new TreeNode("Power");

            tnMain.Nodes.Add("Active power scheme: " + ActivePowerScheme.Name + " (" + ActivePowerScheme.Guid.ToString() + ")");
            tnMain.Nodes.Add("Power Line Status: " + PowerLineStatus.ToString());
            tnMain.Nodes.Add("Battery charge status: " + BatteryChargeStatus.ToString());
            tnMain.Nodes.Add("Battery available: " + BatteryAvailable.ToString());
            tnMain.Nodes.Add("Battery full life time: " + BatteryFullLifetime.ToString());
            tnMain.Nodes.Add("Battery remaining life time: " + BatteryLifeRemaining.ToString());
            tnMain.Nodes.Add("Battery charge percent: " + BatteryLifePercent + "%");
            return(tnMain);
        }
Ejemplo n.º 10
0
        private void HandleBatteryStatus(BatteryChargeStatus chargeStatus)
        {
            if (chargeStatus == BatteryChargeStatus.Low && !infoShown)
            {
                Button.ToolTip = text.Get(TextKey.SystemControl_BatteryChargeLowInfo);
                infoShown      = true;
            }

            if (chargeStatus == BatteryChargeStatus.Critical && !warningShown)
            {
                Button.ToolTip = text.Get(TextKey.SystemControl_BatteryChargeCriticalWarning);
                warningShown   = true;
            }
        }
Ejemplo n.º 11
0
        public void SetBatteryCharge(double charge, BatteryChargeStatus status)
        {
            Dispatcher.InvokeAsync(() =>
            {
                var width = BATTERY_CHARGE_MAX_WIDTH * charge;

                width = width > BATTERY_CHARGE_MAX_WIDTH ? BATTERY_CHARGE_MAX_WIDTH : width;
                width = width < 0 ? 0 : width;

                BatteryCharge.Width = width;
                BatteryCharge.Fill  = status == BatteryChargeStatus.Low ? Brushes.Orange : BatteryCharge.Fill;
                BatteryCharge.Fill  = status == BatteryChargeStatus.Critical ? Brushes.Red : BatteryCharge.Fill;
                Warning.Visibility  = status == BatteryChargeStatus.Critical ? Visibility.Visible : Visibility.Collapsed;
            });
        }
        public void OnBatteryInfoUpdate(object sender, System.Timers.ElapsedEventArgs args)
        {
            lastPercentage = percentage;
            lastStatus     = status;
            lastCharger    = charger;
            percentage     = (int)(SystemInformation.PowerStatus.BatteryLifePercent * 100);
            status         = SystemInformation.PowerStatus.BatteryChargeStatus;
            charger        = SystemInformation.PowerStatus.PowerLineStatus;



            if (client != null && (percentage != lastPercentage || status != lastStatus || charger != lastCharger))
            {
                client.SendToClient(percentage + ";" + status + ";" + charger);
            }
        }
Ejemplo n.º 13
0
 private async void CheckBatteryStatusAsync()
 {
     while (!_stop)
     {
         if (_statusLastCheck != SystemInformation.PowerStatus.BatteryChargeStatus ||
             Math.Abs(_percentLastCheck - SystemInformation.PowerStatus.BatteryLifePercent) >= 0.01)
         {
             _statusLastCheck  = SystemInformation.PowerStatus.BatteryChargeStatus;
             _percentLastCheck = SystemInformation.PowerStatus.BatteryLifePercent;
             OnPropertyChanged(nameof(BatteryStatusVisual));
             OnPropertyChanged(nameof(BatteryStatusVisualVisibility));
             OnPropertyChanged(nameof(BatteryStatusPercent));
         }
         await Task.Delay(CheckDelay);
     }
 }
		private async void CheckBatteryStatusAsync()
		{
			while(!_stop)
			{
				if(_statusLastCheck != SystemInformation.PowerStatus.BatteryChargeStatus
				   || Math.Abs(_percentLastCheck - SystemInformation.PowerStatus.BatteryLifePercent) >= 0.01)
				{
					_statusLastCheck = SystemInformation.PowerStatus.BatteryChargeStatus;
					_percentLastCheck = SystemInformation.PowerStatus.BatteryLifePercent;
					OnPropertyChanged(nameof(BatteryStatusVisual));
					OnPropertyChanged(nameof(BatteryStatusVisualVisibility));
					OnPropertyChanged(nameof(BatteryStatusPercent));
				}
				await Task.Delay(CheckDelay);
			}
		}
        private void GetInformation()
        {
            DateTime last = DateTime.Now.Subtract(new TimeSpan(0, 2, 0));

            while (!stopThread)
            {
                if (last.AddMinutes(1) <= DateTime.Now)
                {
                    percentage = SystemInformation.PowerStatus.BatteryLifePercent;
                    timeLeft   = SystemInformation.PowerStatus.BatteryLifeRemaining;
                    status     = SystemInformation.PowerStatus.BatteryChargeStatus;
                    charger    = SystemInformation.PowerStatus.PowerLineStatus;

                    last = DateTime.Now;
                }

                Thread.Sleep(50);
            }
        }
Ejemplo n.º 16
0
        private void RenderCharge(double charge, BatteryChargeStatus status)
        {
            var width = maxWidth * charge;

            BatteryCharge.Width = width > maxWidth ? maxWidth : (width < 0 ? 0 : width);

            switch (status)
            {
            case BatteryChargeStatus.Critical:
                BatteryCharge.Fill = Brushes.Red;
                break;

            case BatteryChargeStatus.Low:
                BatteryCharge.Fill = Brushes.Orange;
                break;

            default:
                BatteryCharge.Fill = initialBrush;
                break;
            }
        }
Ejemplo n.º 17
0
        private MenuItem GeneratePowerData()
        {
            string pluggedStatus, powerDescription;


            MenuItem powerDataMenuItem = new MenuItem();

            powerDataMenuItem.Enabled = false;
            float batteryPercentage = SystemInformation.PowerStatus.BatteryLifePercent;

            BatteryChargeStatus batteryStatus = SystemInformation.PowerStatus.BatteryChargeStatus;

            if (batteryStatus == BatteryChargeStatus.NoSystemBattery)
            {
                powerDescription       = "No battery detected";
                powerDataMenuItem.Text = powerDescription;
                return(powerDataMenuItem);
            }

            PowerLineStatus powerLineStatus = SystemInformation.PowerStatus.PowerLineStatus;

            pluggedStatus = SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online ? "Plugged in" : "Unplugged";

            // Discharging, time to battery die
            if (powerLineStatus == PowerLineStatus.Offline)
            {
                powerDescription = GenerateBatteryOfflineData(batteryPercentage);
            }
            else
            {
                int secondsToFullCharge = SystemInformation.PowerStatus.BatteryFullLifetime;
                powerDescription = $"{batteryPercentage * 100}% - {pluggedStatus}";
            }
            powerDataMenuItem.Text = powerDescription;

            return(powerDataMenuItem);
        }
Ejemplo n.º 18
0
        private void HandleBatteryStatus(BatteryChargeStatus status)
        {
            if (status == BatteryChargeStatus.Low && !infoShown)
            {
                foreach (var control in controls)
                {
                    control.ShowLowBatteryInfo(text.Get(TextKey.SystemControl_BatteryChargeLowInfo));
                }

                infoShown = true;
                logger.Info("Informed the user about low battery charge.");
            }

            if (status == BatteryChargeStatus.Critical && !warningShown)
            {
                foreach (var control in controls)
                {
                    control.ShowCriticalBatteryWarning(text.Get(TextKey.SystemControl_BatteryChargeCriticalWarning));
                }

                warningShown = true;
                logger.Warn("Warned the user about critical battery charge.");
            }
        }
Ejemplo n.º 19
0
 protected override void OnLoadDefaults()
 {
     chosenStatus = PowerStatusChoice.PowerState;
     chosenBCS    = BatteryChargeStatus.Charging;
     percentage   = 30;
 }
Ejemplo n.º 20
0
 /// <summary>
 /// Initializes a new instance of MachineStatus
 /// </summary>
 /// <param name="ip">IP Address of the monitored device</param>
 /// <param name="blf">The remaining Battery Life Percentage</param>
 /// <param name="bcs">the Battery Charge Status</param>
 /// <param name="cpu">The Average CPU usage percentage</param>
 /// <param name="mem">The Average Memory usage percentage</param>
 /// <param name="disk">The percentage of free space in the deault HDD</param>
 internal MachineStatus(IPAddress ip, int blf, BatteryChargeStatus bcs, int cpu, int mem, int disk)
     : this(ip, blf, bcs, cpu, mem, disk, "")
 {
 }
Ejemplo n.º 21
0
 /// <summary>
 /// Initializes a new instance of MachineStatus
 /// </summary>
 /// <param name="ip">IP Address of the monitored device</param>
 /// <param name="blf">The remaining Battery Life Percentage</param>
 /// <param name="bcs">the Battery Charge Status</param>
 /// <param name="cpu">The Average CPU usage percentage</param>
 internal MachineStatus(IPAddress ip, int blf, BatteryChargeStatus bcs, int cpu)
     : this(ip, blf, bcs, cpu, -1, -1, "")
 {
 }
Ejemplo n.º 22
0
        public void Battery()
        {
            ACStatus.Text      = "電源状態不明";
            BatteryStatus.Text = "???%";
            DateTime dt = DateTime.Now;

            TimeLabel.Text = dt.ToString("HH:mm:ss");
            PowerLineStatus     PowerLineStatus     = SystemInformation.PowerStatus.PowerLineStatus;
            BatteryChargeStatus BatteryChargeStatus = SystemInformation.PowerStatus.BatteryChargeStatus;
            float BatteryPercent = SystemInformation.PowerStatus.BatteryLifePercent;

            switch (PowerLineStatus)
            {
            case PowerLineStatus.Online:
                switch (BatteryChargeStatus)
                {
                case BatteryChargeStatus.Charging:
                    ACStatus.Text = "AC電源\nバッテリー充電中";
                    break;

                case BatteryChargeStatus.NoSystemBattery:
                    ACStatus.Text = "AC電源";
                    break;

                case BatteryChargeStatus.Critical:
                    ACStatus.Text = "AC電源\nバッテリー僅少";
                    break;

                case BatteryChargeStatus.High:
                    ACStatus.Text = "AC電源\nバッテリー高";
                    break;

                case BatteryChargeStatus.Low:
                    ACStatus.Text = "AC電源\nバッテリー少";
                    break;

                case BatteryChargeStatus.Unknown:
                    ACStatus.Text = "AC電源\nバッテリー不明";
                    break;

                default:
                    ACStatus.Text = "AC電源\nバッテリー中";
                    break;
                }
                if (BatteryChargeStatus == BatteryChargeStatus.NoSystemBattery)
                {
                    BatteryStatus.Text = "";
                }
                else
                {
                    BatteryStatus.Text = (BatteryPercent * 100).ToString() + "%";
                }
                break;

            case PowerLineStatus.Offline:
                switch (BatteryChargeStatus)
                {
                case BatteryChargeStatus.Charging:
                    ACStatus.Text = "バッテリー充電中";
                    break;

                case BatteryChargeStatus.Critical:
                    ACStatus.Text = "バッテリー僅少";
                    break;

                case BatteryChargeStatus.High:
                    ACStatus.Text = "バッテリー高";
                    break;

                case BatteryChargeStatus.Low:
                    ACStatus.Text = "バッテリー少";
                    break;

                case BatteryChargeStatus.Unknown:
                    ACStatus.Text = "バッテリー不明";
                    break;

                default:
                    ACStatus.Text = "バッテリー中";
                    break;
                }
                BatteryStatus.Text = (BatteryPercent * 100).ToString() + "%";
                break;

            default:
                ACStatus.Text = "お手上げ";
                break;
            }
        }
Ejemplo n.º 23
0
        internal void Win32_SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
        {
            if (OnPowerModeChanged != null)
            {
                OnPowerModeChanged(this, new EventArgsValue <PowerModes>(e.Mode));
            }
            switch (e.Mode)
            {
            case PowerModes.Resume:
                if (OnResume != null)
                {
                    OnResume(this, new EventArgs());
                }
                break;

            case PowerModes.Suspend:
                if (OnSuspend != null)
                {
                    OnSuspend(this, new EventArgs());
                }
                break;

            case PowerModes.StatusChange:
                if (OnPowerLineStatusChanged != null)
                {
                    PowerLineStatus oldValuePLS = (PowerLineStatus)oldValues[EventType.PowerLineStatusChanged];
                    PowerLineStatus newValuePLS = Status.Power.PowerLineStatus;
                    if (oldValuePLS != newValuePLS)
                    {
                        OnPowerLineStatusChanged(this, new EventArgsValues <PowerLineStatus>(oldValuePLS, newValuePLS));
                        oldValues[EventType.PowerLineStatusChanged] = newValuePLS;
                    }
                }
                BatteryChargeStatus oldValueBCS = (BatteryChargeStatus)oldValues[EventType.BatteryStatusChanged];
                BatteryChargeStatus newValueBCS = Status.Power.BatteryChargeStatus;
                if (OnBatteryStatusChanged != null)
                {
                    if (oldValueBCS != newValueBCS)
                    {
                        OnBatteryStatusChanged(this, new EventArgsValues <BatteryChargeStatus>(oldValueBCS, newValueBCS));
                        oldValues[EventType.BatteryStatusChanged] = newValueBCS;
                    }
                }
                if (OnBatteryAvailabilityChanged != null)
                {
                    bool?oldValueBCSb = null, newValueBCSb = null;
                    if (oldValueBCS == BatteryChargeStatus.NoSystemBattery)
                    {
                        oldValueBCSb = false;
                    }
                    else if (oldValueBCS != BatteryChargeStatus.Unknown)
                    {
                        oldValueBCSb = true;
                    }
                    if (newValueBCS == BatteryChargeStatus.NoSystemBattery)
                    {
                        newValueBCSb = false;
                    }
                    else if (newValueBCS != BatteryChargeStatus.Unknown)
                    {
                        newValueBCSb = true;
                    }

                    if (oldValueBCSb != newValueBCSb)
                    {
                        OnBatteryAvailabilityChanged(this, new EventArgsValue <bool?>(newValueBCSb));
                    }
                }
                break;
            }
        }
Ejemplo n.º 24
0
 public BatteryStatus(BatteryChargeStatus status, int chargeLevel, double?voltage = null)
 {
     Status      = status;
     ChargeLevel = chargeLevel;
     Voltage     = voltage;
 }
Ejemplo n.º 25
0
 public BatteryStatusResult(BatteryChargeStatus status, int chargeLevel, int voltage)
 {
     Status      = status;
     ChargeLevel = chargeLevel;
     Voltage     = voltage;
 }
        public static void UpdateIcon(int percentage, BatteryChargeStatus status, PowerLineStatus charger)
        {
            int index = (int)(percentage / 11.5f);

            if (charger == PowerLineStatus.Online)
            {
                index += 13;
            }

            if ((status & BatteryChargeStatus.Low) == BatteryChargeStatus.Low && charger == PowerLineStatus.Offline)
            {
                index = 9;
            }
            else if ((status & BatteryChargeStatus.Critical) == BatteryChargeStatus.Critical && charger == PowerLineStatus.Offline)
            {
                index = 10;
            }
            else if ((status & BatteryChargeStatus.NoSystemBattery) == BatteryChargeStatus.NoSystemBattery)
            {
                index = 11;
            }

            try
            {
                instance.trayIcon.Icon = instance.parse.GetIcon(index);
            }
            catch (Exception)
            {
            }

            string text = percentage + "% " + TranslationManager.Get("remaining");
            string msg  = "";

            if (percentage == 100 && charger == PowerLineStatus.Online)
            {
                msg = TranslationManager.Get("FullyCharged");
            }
            else if (charger == PowerLineStatus.Online)
            {
                msg = TranslationManager.Get("PluggedIn");

                if ((status & BatteryChargeStatus.Charging) == BatteryChargeStatus.Charging)
                {
                    msg += ", " + TranslationManager.Get("Charging");
                }
                else
                {
                    msg += ", " + TranslationManager.Get("NotCharging");
                }
            }

            if ((status & BatteryChargeStatus.NoSystemBattery) == BatteryChargeStatus.NoSystemBattery)
            {
                instance.currentText = TranslationManager.Get("NoBattery");
            }
            else
            {
                instance.currentText = text + (msg == "" ? "" : (" (" + msg + ")"));
            }
            instance.trayIcon.Text = instance.currentText;

            if (instance.currentState != status && ((status & BatteryChargeStatus.Low) == BatteryChargeStatus.Low ||
                                                    (status & BatteryChargeStatus.Critical) == BatteryChargeStatus.Critical) && (status & BatteryChargeStatus.Charging) != BatteryChargeStatus.Charging)
            {
                instance.trayIcon.ShowBalloonTip(3000, TranslationManager.Get("warning1"), TranslationManager.Get("warning2"), ToolTipIcon.Warning);
            }
            if (((status & BatteryChargeStatus.Low) == BatteryChargeStatus.Low || (status & BatteryChargeStatus.Critical) == BatteryChargeStatus.Critical) &&
                charger == PowerLineStatus.Offline)
            {
                instance.warningText = TranslationManager.Get("warning1") + "\n" + TranslationManager.Get("warning2");
            }
            else
            {
                instance.warningText = "";
            }

            try
            {
                instance.baseImage = instance.parse.GetBitmap(index);
            }
            catch (Exception)
            {
            }

            instance.currentState = status;

            GC.Collect();
        }
Ejemplo n.º 27
0
        private void timer_Tick(object sender, EventArgs e)
        {
            PowerStatus powerStatus  = SystemInformation.PowerStatus;
            bool        fullyCharged = (powerStatus.BatteryLifePercent == 1.0);

            BatteryChargeStatus chargeStatus = SystemInformation.PowerStatus.BatteryChargeStatus;
            bool charging  = chargeStatus.HasFlag(BatteryChargeStatus.Charging);
            bool critical  = chargeStatus.HasFlag(BatteryChargeStatus.Critical);
            bool noBattery = chargeStatus.HasFlag(BatteryChargeStatus.NoSystemBattery);

            PowerLineStatus powerLineStatus = SystemInformation.PowerStatus.PowerLineStatus;
            bool            pluggedIn       = (powerLineStatus == PowerLineStatus.Online);

            batteryPercentage = (powerStatus.BatteryLifePercent * 100).ToString();

            Color fontColor = Color.White;

            if (!noBattery)
            {
                if (charging || (pluggedIn && fullyCharged))
                {
                    fontColor = Color.Lime;
                }
                else if (critical)
                {
                    fontColor = Color.Red;
                }
            }

            using (Bitmap bitmap = new Bitmap(DrawText(batteryPercentage, new Font(iconFont, iconFontSize), fontColor, Color.Black)))
            {
                System.IntPtr intPtr = bitmap.GetHicon();
                try
                {
                    using (Icon icon = Icon.FromHandle(intPtr))
                    {
                        string description = "";
                        if (noBattery)
                        {
                            description = "No Battery Detected";
                        }
                        else if (pluggedIn)
                        {
                            if (charging)
                            {
                                description = string.Format("Charging ({0}%)", batteryPercentage);
                            }
                            else if (fullyCharged)
                            {
                                description = string.Format("Fully Charged ({0}%)", batteryPercentage);
                            }
                            else
                            {
                                description = string.Format("Not Charging ({0}%)", batteryPercentage);
                            }
                        }
                        else
                        {
                            int totalRemaining = SystemInformation.PowerStatus.BatteryLifeRemaining;
                            if (totalRemaining > 0)
                            {
                                TimeSpan timeSpan = TimeSpan.FromSeconds(totalRemaining);
                                description = string.Format("{1} hr {2:D2} min ({0}%) remaining", batteryPercentage, timeSpan.Hours, timeSpan.Minutes);
                            }
                            else
                            {
                                description = string.Format("{0}% remaining", batteryPercentage);
                            }
                        }
                        notifyIcon.Icon = icon;
                        notifyIcon.Text = description;

                        descriptionMenuItem.Text = description;
                    }
                }
                finally
                {
                    DestroyIcon(intPtr);
                }
            }
        }
Ejemplo n.º 28
0
        private void iconUpdate()
        {
            PowerStatus powerStatus = SystemInformation.PowerStatus;

            batteryPercentage = (int)Math.Round((powerStatus.BatteryLifePercent * 100), 0);

            Color foreground = Color.White;
            BatteryChargeStatus batteryChargeStatus = SystemInformation.PowerStatus.BatteryChargeStatus;
            bool charging = batteryChargeStatus.HasFlag(BatteryChargeStatus.Charging);

            if (charging)
            {
                foreground = Color.FromArgb(255, 0, 255, 0);
            }
            else if (batteryPercentage < 30)
            {
                foreground = Color.FromArgb(255, 255, 0, 0);
            }
            else
            {
                foreground = Color.FromArgb(255, 255, 255, 255);
            }

            // Color background = Color.Black;
            Color background = Color.Transparent;

            string    drawMe = batteryPercentage.ToString();
            Font      fontToUse;
            Brush     brushToUse = new SolidBrush(foreground);
            Rectangle rect;
            Bitmap    bitmapText;
            Graphics  g;

            if (batteryPercentage == 100)
            {
                // reduce size to fit "100"
                fontToUse = new Font("Tahoma", 20, FontStyle.Regular, GraphicsUnit.Pixel);
            }
            else
            {
                fontToUse = new Font("Tahoma", 28, FontStyle.Regular, GraphicsUnit.Pixel);
            }

            rect       = new Rectangle(-6, 2, 42, 32);
            bitmapText = new Bitmap(32, 32);

            g = Graphics.FromImage(bitmapText);
            g.Clear(background);

            using (SolidBrush brush = new SolidBrush(background))
            {
                g.FillRectangle(brush, 0, 0, 32, 32);
            }
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit;
            StringFormat sf = new StringFormat();

            sf.Alignment     = StringAlignment.Center;
            sf.LineAlignment = StringAlignment.Center;
            g.DrawString(drawMe, fontToUse, brushToUse, rect, sf);
            g.Save();

            System.IntPtr intPtr = bitmapText.GetHicon();
            try
            {
                using (Icon icon = Icon.FromHandle(intPtr))
                {
                    notifyIcon.Icon = icon;

                    if (!charging)
                    {
                        int seconds = SystemInformation.PowerStatus.BatteryLifeRemaining;
                        int mins    = seconds / 60;
                        int hours   = mins / 60;
                        mins            = mins % 60;
                        notifyIcon.Text = hours + ":" + mins + " remaining";
                    }
                    else
                    {
                        notifyIcon.Text = "Charging";
                    }
                }
            }
            finally
            {
                DestroyIcon(intPtr);
            }


            //	hIcon = (bitmapText.GetHicon());
            //	notifyIcon.Icon = System.Drawing.Icon.FromHandle(hIcon);
            //	notifyIcon.Text = "Remaining " + batteryPercentage.ToString() + "%";
        }