Jul 28, 2012

Get Laptop battery status using C#

8 comments
In this article, I will show you how to show battery status of laptop battery like is discharging, charging, full etc. We will do this using WMI because WMI have power to answer questions about battery status .So let's start with WMI.

To access account information of Battery we need to Use System.Management  name space. To use this name space first of all we need to add reference to System.management by Project Menu>>Add Reference.

After tis at the top of the code use: using System.Management;

So that you can use of its classes . Now its simple to get information about laptop Battery through querying ManagementObjectSearcher Class .

We can get all information about Laptop Battery through Win32_Battery class.
So we need to query on that class to get related Management object and then we just need to get various properties related to it.
        Dictionary < int, string > StatusCodes;
        private void Form1_Load(object sender, EventArgs e)
        {
            StatusCodes = new Dictionary < int, string >();
            StatusCodes.Add(1, "The battery is discharging");
            StatusCodes.Add(2, "The system has access to AC. However, the battery is not necessarily charging");
            StatusCodes.Add(3, "Fully Charged");
            StatusCodes.Add(4, "Low");
            StatusCodes.Add(5, "Critical");
            StatusCodes.Add(6, "Charging");
            StatusCodes.Add(7, "Charging and High");
            StatusCodes.Add(8, "Charging and Low");
            StatusCodes.Add(9, "Undefined");
            StatusCodes.Add(10,"Partially Charged");
 
            /* Set progress bar values and Properties */
            progressBar1.Maximum = 100;
            progressBar1.Style = ProgressBarStyle.Continuous;
 
 
            timer1.Enabled = true;
 
            ManagementObjectSearcher mos = new ManagementObjectSearcher("select * from Win32_Battery");
            foreach (ManagementObject mo in mos.Get())
            {
                lblBatteryName.Text = mo["Name"].ToString();
                UInt16 statuscode = (UInt16)mo["BatteryStatus"];
                string statusString = StatusCodes[statuscode];
                lblBatteryStatus.Text = statusString;
            }
        }
 
        private void OnTimer_Tick(object sender, EventArgs e)
        {
            ManagementObjectSearcher mos = new ManagementObjectSearcher("select * from Win32_Battery where Name='"+lblBatteryName.Text+"'");
            foreach (ManagementObject mo in mos.Get())
            {
 
                UInt16 statuscode = (UInt16)mo["BatteryStatus"];
                string statusString = StatusCodes[statuscode];
                lblBatteryStatus.Text = statusString;
               
                /* Set Progress bar according to status  */
                if (statuscode == 4)
                {
                    progressBar1.ForeColor = Color.Red;
                    progressBar1.Value = 5;
                }
                else if (statuscode == 2)
                {
                    progressBar1.ForeColor = Color.Green;
                    progressBar1.Value = 100;
                }
                else if (statuscode == 5)
                {
                    progressBar1.ForeColor = Color.Red;
                    progressBar1.Value = 1;
                }
            }
        }

The same thing, how to achieve without using WMI Class
Here it is,

Then after searching in MSDN, I found PowerStatus class, which is part of System.Windows.Forms namespace, which can be used to get the battery level. Here is a implementation, which shows battery status as well as system connection to AC power.

private void btnGetBatteryStatus_Click(object sender, EventArgs e)
        {
            PowerStatus status = SystemInformation.PowerStatus;
            progressBarStatus.Value = (int)(status.BatteryLifePercent * 100);
            lblBatterLevel.Text = String.Format("{0}%", (status.BatteryLifePercent * 100));

            switch (status.PowerLineStatus)
            {
                case PowerLineStatus.Online:
                    rdoConnected.Checked = true;
                    break;

                case PowerLineStatus.Offline:
                    rdoNotConnected.Checked = true;
                    break;

                default:
                    rdoUnknown.Checked = true;
                    break;
            }
        }

And see here is the above sample code running on my laptop.


We are done now.

If you feel this is helpful or you like it, Please share this using share buttons available on page.

8 comments :

  1. For Battry Charging details and etc. please viist https://www.facebook.com/just4information link there you can find BatteryChecker app.

    ReplyDelete
  2. pls how do i do this using wpf and not windows form

    ReplyDelete
  3. Thanks for your informative article and the blog. Your article is very useful for .net professionals and freshers looking for interview. Best DOT NET Training | Dot Net course Chennai

    ReplyDelete
  4. Thank you for this valuable information. I have got some important suggestions from it. Get your business to the next level in simple steps.
    erp software solutions in chennai.

    ReplyDelete
  5. Excellent post! I heve read your blog it's very interesting and informative. Keep sharing.
    erp providers in chennai | erp software solutions in chennai

    ReplyDelete
  6. Nice blog. Thank you for sharing. The information you shared is very effective for learners I have got some important suggestions from it.. Web Designing Training Institute in Chennai | Web Designing Training Institute in Velachery.

    ReplyDelete
  7. Really an amazing post..! By reading your blog post i gained more information..Dot Net Training Institute in Chennai | Dot Net Training Institute in Velachery

    ReplyDelete