Putting colour/color to work on the console






4.75/5 (12 votes)
Jul 9, 2002
2 min read

126653

1472
How to change the colour/color of text in a console app

Introduction
Whilst developing application running on the console is probably not the most exciting place, it is a great place to use for test harnesses or utilities. Of course when you are outputting text to the console window it can get pretty hard to see what's going on - what you need to be able to do is change the colour of the output text...
However, one of my main gripes with the .NET framework is the amount of functionality missing from various areas
- don't even get me started about some of the problems with the System.Net
area.
This articles gives a quick intro into how to resolve some of the problems with the Console
class.
.NET Console applications appear to use the standard Win32 console, implemented in kernel32.dll. This means that all of the console functions documented in the Platform SDK will work. (see MSDN) for the SDK details.
In order to make changing colours easy and simple, we will implement a static class that allows the console colour to be changed:
ConsoleColour.cs
using System;
// need this to make API calls
using System.Runtime.InteropServices;
namespace PFitzsimons.ConsoleColour
{
/// <summary>
/// Static class for console colour manipulation.
/// </summary>
public class ConsoleColour
{
// constants for console streams
const int STD_INPUT_HANDLE = -10;
const int STD_OUTPUT_HANDLE = -11;
const int STD_ERROR_HANDLE = -12;
[DllImportAttribute("Kernel32.dll")]
private static extern IntPtr GetStdHandle
(
int nStdHandle // input, output, or error device
);
[DllImportAttribute("Kernel32.dll")]
private static extern bool SetConsoleTextAttribute
(
IntPtr hConsoleOutput, // handle to screen buffer
int wAttributes // text and background colors
);
// colours that can be set
[Flags]
public enum ForeGroundColour
{
Black = 0x0000,
Blue = 0x0001,
Green = 0x0002,
Cyan = 0x0003,
Red = 0x0004,
Magenta = 0x0005,
Yellow = 0x0006,
Grey = 0x0007,
White = 0x0008
}
// class can not be created, so we can set colours
// without a variable
private ConsoleColour()
{
}
public static bool SetForeGroundColour()
{
// default to a white-grey
return SetForeGroundColour(ForeGroundColour.Grey);
}
public static bool SetForeGroundColour(
ForeGroundColour foreGroundColour)
{
// default to a bright white-grey
return SetForeGroundColour(foreGroundColour, true);
}
public static bool SetForeGroundColour(
ForeGroundColour foreGroundColour,
bool brightColours)
{
// get the current console handle
IntPtr nConsole = GetStdHandle(STD_OUTPUT_HANDLE);
int colourMap;
// if we want bright colours OR it with white
if (brightColours)
colourMap = (int) foreGroundColour |
(int) ForeGroundColour.White;
else
colourMap = (int) foreGroundColour;
// call the api and return the result
return SetConsoleTextAttribute(nConsole, colourMap);
}
}
}
Now that we have a console colour class we can use it anywhere in our apps to change the current colour. Note that we can use any standard .NET console calls, everything will work - just in colour - reminds me of all those new mobile adverts, who can make such a fuss out of a bit of colour? :)
Now we can put our class to work:
Console.cs
using System;
// we want color output
using PFitzsimons.ConsoleColour;
namespace MyApp
{
public class MyApp
{
public static void Main()
{
ConsoleColour.SetForeGroundColour(
ConsoleColour.ForeGroundColour.Green);
Console.WriteLine("Text in green");
ConsoleColour.SetForeGroundColour(
ConsoleColour.ForeGroundColour.Red);
Console.WriteLine("Text in red");
// reset console back to a default
ConsoleColour.SetForeGroundColour();
}
}
}
As you can see the code is pretty simple, but from a user point of view - its much easier to read the output.
Conclusion
As you can see, its' pretty straight forward, in production code you would expect have the class tell you what the current console colour was, use properties rather than function etc - but I've tried to keep the code to a minimum to show how simple this is.
If you read the SDK you will see that you can also position the cursor, peek at console
input (useful to see if the user has pressed a key), set font sizes and set the window
title. These are all things that should have been in the Console
class to begin with - lets
hope MS resolve this in the next version of the framework, until then we are all going to have to write
ancillary classes to fix these kinds of omissions.