This project has been moved to GitHub.

New location:

Many years ago I published on my blog a helper class for working with the Windows console that was wrapping the Windows console API. Looking back at it I realized it was a pretty naive implementation. So I decided to start a new and make something more flexible and easier to use. Hopefully, I was more successful. The result is a small C++ template library called cppconlib, available on codeplex.

cppconlib is built with C++11 features and requires Visual Studio 2012 or newer. The library is available in a single header called conmanip.h and provides a set of helper classes, functions and constants for manipulating a Windows console (using the Windows console functions). The library features the following components:

  • console_context<T>: represents a context object for console operations; its main purpose is restoring console settings; typedefs for the three consoles are available (console_in_context, console_out_context and console_err_context)
  • console<T>: represents a console objects providing operations such as changing the foreground and background colors, the input mode, screen buffer size, title, and others; typedefs for the three consoles are available (console_in, console_out and console_err)
  • manipulating functions that can be used with cout/wcout and cin/wcin: settextcolor()/restoretextcolor(), setbgcolor()/restorebgcolor(), setcolors(), setmode()/clearmode(), setposx()/setposy()/setpos().

The library can be downloaded from here. Detailed documentation is available here.



The following example prints some text in custom colors and then reads text in a different set of colors.


The following code prints a rhomb to the console:


For more details and updates check the project at codeplex:

UPDATE: A NuGet package for cppconlib is available.

, , , , , , , Hits for this post: 44219 .

only 1 comment untill now

  1. Hi Marius, I use your library and had to make this one addition to hide the cursor while running. Might I suggest including it in a future release.

    Another static global function:

    static void _setcursorvis(HANDLE const console, bool visible)
    ::GetConsoleCursorInfo(console, &cur);
    cur.bVisible = false;
    SetConsoleCursorInfo(console, &cur);

    Then in the console class:

    void setcursorvis(bool visible)
    _details::_setcursorvis(context.handle, visible);


    console_out_context ctxout;
    console_out conout(ctxout);

    Thanks for the great library.

Add your comment now