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;
using System.Runtime.InteropServices;
namespace PFitzsimons.ConsoleColour
{
public class ConsoleColour
{
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
);
[DllImportAttribute("Kernel32.dll")]
private static extern bool SetConsoleTextAttribute
(
IntPtr hConsoleOutput,
int wAttributes
);
[Flags]
public enum ForeGroundColour
{
Black = 0x0000,
Blue = 0x0001,
Green = 0x0002,
Cyan = 0x0003,
Red = 0x0004,
Magenta = 0x0005,
Yellow = 0x0006,
Grey = 0x0007,
White = 0x0008
}
private ConsoleColour()
{
}
public static bool SetForeGroundColour()
{
return SetForeGroundColour(ForeGroundColour.Grey);
}
public static bool SetForeGroundColour(
ForeGroundColour foreGroundColour)
{
return SetForeGroundColour(foreGroundColour, true);
}
public static bool SetForeGroundColour(
ForeGroundColour foreGroundColour,
bool brightColours)
{
IntPtr nConsole = GetStdHandle(STD_OUTPUT_HANDLE);
int colourMap;
if (brightColours)
colourMap = (int) foreGroundColour |
(int) ForeGroundColour.White;
else
colourMap = (int) foreGroundColour;
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;
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");
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.