Bits & Bytes

Posts Tagged ‘windows’

Fixing an Empty Battery Indicator in Windows

empty_battery

Shortly after accidentally dumping water on my computer and letting it dry out, it developed an odd error where the battery always indicated that it was empty even when it was fully charged. I searched unsuccessfully for a fix before finding a simple one of my own. This worked on a Windows 8.1 machine, but a similar fix will probably work on any version of Windows.

  1. Start by opening up the Control Panel
    1. Slide the cursor into the upper-right corner and bring it down along the right edge to open the side menu
    2. In the side menu, left-click Settings to open the right-side Settings menu.
    3. In the Settings menu, left-click Control Panel to open the Control Panel window shown below.

    control_panel

  2. Open the Device Manager
    1. Left-click Hardware and Sound (see above) in the Control Panel to open it.
    2. Left-click Device Manager in the Hardware and Sound window (below) under Devices and Printers.

    HardwareAndSound

  3. Uninstall all of the drivers under Batteries
    1. In the Device Manager and under Batteries, right-click a driver to open the context menu, as show below and left-click Uninstall
      uninstall_first
    2. A dialog like the one below may pop up. Left-click the OK button to confirm the uninstall.
      confirm
    3. Repeat those steps for each driver.
      uninstall_second
    4. When you are finished, the category for Batteries will be gone.
      device_manager
  4. Right-click the main computer icon to open the context menu shown below, and left-click Scan for hardware changes, as show below. This will replace the drivers. However, you may need to restart the computer to reset the battery indicator.
    scan


Using WPF in a C# Console Application

In this blog post, I demonstrate how to create a C# console application that can open a Windows Presentation Foundation window so that we can draw WPF graphics in a console program. The methodology is important because it can be used to add Windows Presentation Foundation classes to any type of C# project.

  1. To start, you should have a default C# Console Application project open. If you do not know how to create a C# console application project, you can consult our prior blog post on that topic.
    OpenProject
  2. Once you have a console application project open, it should have a Program.cs file with the following code inside it:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication {
        class Program {
            static void Main(string[] args) {
            }
        }
    }
    

    As the namespace indicates, the project was created using the default project name ConsoleApplication.

  3. We need to change some of the code. Begin by replacing the lines
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    

    with the line

    using System.Windows;
    
  4. Directly after the line
    class Program {

    add this line

    [STAThread]
  5. Directly after the line
    static void Main(string[] args) {

    add the following lines of code:

    Window qWindow = new Window();
    qWindow.Title = "WPF in Console";
    qWindow.Width = 400;
    qWindow.Height = 300;
    qWindow.ShowDialog();
    

    The final program should look like this

    using System;
    using System.Windows;
    
    namespace ConsoleApplication {
        class Program {
            [STAThread]
            static void Main(string[] args) {
                Window qWindow = new Window();
                qWindow.Title = "WPF in Console";
                qWindow.Width = 400;
                qWindow.Height = 300;
                qWindow.ShowDialog();
            }
        }
    }
    
  6. That is all of the code. Next, we need to add the libraries that the program uses. To do this, right-click References in the Solution Explorer pane on the right of the screen, and left-click Add Reference… in the context menu that pops up.
  7. That will open the Reference Manager dialog shown below. Navigate to Assemblies->Framework by left-clicking them, and then left-click the check boxes next to PresentationCore, PresentationFramework, and WindowsBase. Finish by left-clicking the OK button.
    ReferenceManager
  8. Now the code and project are ready. To compile and execute the program, left-click DEBUG in the menubar and left-click Start Without Debugging in the submenu. When it finishes compiling, you should see this window:
    Output

Perhaps the most important line of code in this program is [STAThread]. Without this, you can not compile WPF code. STA stands for Single Threaded Apartment. It is a directive for COM. the Component Object Model. If that does not makes sense, feel free to ignore it.

The code inside the Main() function, creates a Window object, sets the text in the title bar, sets the size of the window to 400 by 300 pixels, and causes the window to be displayed with the call to ShowDialog().

Creating a Simple Form to Display Text Messages in C#

Although it is possible to use a simple MessageBox for printing messages, it is sometimes convenient to use a window that you have more control over. Below, I have the C# code for a simple console application named “MyConsoleApplication.” I created the project using the Console Application template, which creates the empty Main() function shown below. The code file is named “Program.cs” for simplicity, but it could be named anything.

We need to add a reference to the assembly System.Windows.Forms, in order to be able create Forms in the code. We also need to add the corresponding using directive using System.Windows.Forms; at the top of the code file. Finally, we need to add a reference to the assembly System.Drawing in order to set the size of the Form in the line: qMyForm.ClientSize = qMyTextbox.Size;.

Beyond that, the code that I have added is all inside the Main() function. First, I create a Form and add the text “An Important Message” to the title bar. Next, I create a TextBox and set its size to 400 by 300 pixels. Then I set it to accept multiple lines of text, enable the vertical scrollbar to accommodate text overruns, and set it to be read only so that the text cannot be modified.

The middle block of code consists of several calls to the member function AppendText(). Each call adds a line of text from the Bible, Proverbs 4:10-13. The character sequence \u000D\u000A is the unicode representation of the carriage return and linefeed characters. So, that moves the text to the beginning of the next line. On a related note, the TextBox has word wrap enabled by default.

The third block of code sets the size of the containing Form to have a client area that is the same size as the TextBox. Then the TextBox is added to the Form, and the Form is displayed via a call to ShowDialog().

The output of the program looks like this:

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FormStringOutput;
using System.Windows.Forms;

namespace MyConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            Form qMyForm = new Form();
            // Sets the title bar text
            qMyForm.Text = "An Important Message";
            TextBox qMyTextbox = new TextBox();
            qMyTextbox.SetBounds(0, 0, 400, 300);
            qMyTextbox.Multiline = true;
            qMyTextbox.ScrollBars = ScrollBars.Vertical;
            qMyTextbox.ReadOnly = true;

            // Add messages via AppendText, using '\u000D\u000A' for new line characters
            qMyTextbox.AppendText("Hear, my child, and accept my words,\u000D\u000A");
            qMyTextbox.AppendText("    that the years of your life may be many.\u000D\u000A");
            qMyTextbox.AppendText("I have taught you the way of wisdom;\u000D\u000A");
            qMyTextbox.AppendText("    I have led you in the paths of uprightness.\u000D\u000A");
            qMyTextbox.AppendText("When you walk, your step will not be hampered;\u000D\u000A");
            qMyTextbox.AppendText("    and if you run, you will not stumble.\u000D\u000A");
            qMyTextbox.AppendText("Keep hold of instruction; do not let go;\u000D\u000A");
            qMyTextbox.AppendText("    guard her, for she is your life.\u000D\u000A");
            qMyTextbox.AppendText("\u000D\u000A             Proverbs 4:10-13\u000D\u000A");

            // Set the client area of the form equal to the size of the Text Box
            qMyForm.ClientSize = qMyTextbox.Size;
            // Add the Textbox to the form
            qMyForm.Controls.Add(qMyTextbox);
            // Display the form
            qMyForm.ShowDialog();
        }
    }
}