Click here to Skip to main content
Click here to Skip to main content

Attaching a Console to a WinForms application

By , 7 Feb 2012
 
When debugging a Windows Forms application, the Console class is often used (in place of the Debug class) to write to the IDE's Output window.
 
It is possible to attach one actual console window to the process by using the AllocConsole function from kernel32.dll and its matching FreeConsole to release it.
 
This is not restricted to debugging, but that's probably where it has the most use.
 
An example of usage:
 
using System;
using System.Windows.Forms;
 
namespace FormWithConsole
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
#if DEBUG
            NativeMethods.AllocConsole();
            Console.WriteLine("Debug Console");
#endif
            Application.Run(new FormMain());
#if DEBUG
            NativeMethods.FreeConsole();
#endif
        }
    }
}
 
and the class containing the P/Invoke functions:
 
using System;
using System.Runtime.InteropServices;
 
namespace FormWithConsole
{
    internal static class NativeMethods
    {
        // http://msdn.microsoft.com/en-us/library/ms681944(VS.85).aspx
        /// <summary>
        /// Allocates a new console for the calling process.
        /// </summary>
        /// <returns>nonzero if the function succeeds; otherwise, zero.</returns>
        /// <remarks>
        /// A process can be associated with only one console,
        /// so the function fails if the calling process already has a console.
        /// </remarks>
        [DllImport("kernel32.dll", SetLastError = true)]
        internal static extern int AllocConsole();
 
        // http://msdn.microsoft.com/en-us/library/ms683150(VS.85).aspx
        /// <summary>
        /// Detaches the calling process from its console.
        /// </summary>
        /// <returns>nonzero if the function succeeds; otherwise, zero.</returns>
        /// <remarks>
        /// If the calling process is not already attached to a console,
        /// the error code returned is ERROR_INVALID_PARAMETER (87).
        /// </remarks>
        [DllImport("kernel32.dll", SetLastError = true)]
        internal static extern int FreeConsole();
    }
}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

DaveyM69
United Kingdom United Kingdom
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralAnother waymemberGSerjo30 Jul '12 - 11:52 
GeneralRe: Another waymemberJason Vogel18 Mar '13 - 5:57 
GeneralRe: Thank you very much for the explanation. I get the idea now ...memberhoernchenmeister8 Feb '12 - 0:19 
GeneralRe: Hi You can (early in your program) implement a ConsoleTrac...memberwvd_vegt8 Feb '12 - 0:04 
GeneralRe: Thanks for your comment. Yes, you are right, I use Console.W...memberhoernchenmeister7 Feb '12 - 22:46 
GeneralRe: thanks ! .. I might get to test it later today :-) memberGarth J Lancaster7 Aug '11 - 13:13 
GeneralReason for my vote of 5 good one.membernikhi _singh26 Feb '12 - 17:46 
GeneralJust a minor remark on extern calls. When researching why my...memberTetheredSun6 Feb '12 - 22:20 
GeneralRe: Good point - in winDef.h BOOL is defined like: typedef i...mentorDaveyM697 Feb '12 - 10:37 
GeneralJust a quick note. The console window has to be attached bef...memberhoernchenmeister5 Feb '12 - 21:30 
GeneralRe: Hi You're clearly doing something wrong (like using Console...memberwvd_vegt7 Feb '12 - 22:20 
GeneralHi If you use this do not forget to remove the close button...memberwvd_vegt26 Jan '12 - 1:39 
GeneralReason for my vote of 5 Nice tip, thanks for sharingmemberhoernchenmeister20 Jan '12 - 2:41 
GeneralGreat tip, I just made a test with a WinFormApp having 2 but...memberhoernchenmeister20 Jan '12 - 2:41 
GeneralReason for my vote of 5 5edmemberjohannesnestler18 Jan '12 - 4:49 
GeneralReason for my vote of 4 Nice tipmemberzenwalker198519 Oct '11 - 3:29 
Generalinteresting - I was thinking about the inverse 'ConsoleWithF...memberGarth J Lancaster5 Aug '11 - 1:43 
GeneralRe: This is possible too: using System.Windows.Forms; namespace...mentorDaveyM696 Aug '11 - 1:00 
GeneralReason for my vote of 5 Stumbled upon a neat trick. Although...memberSimulationofSai2 Mar '11 - 15:34 
GeneralReason for my vote of 5 Thinkmembereg_Anubhava15 Nov '10 - 20:49 
GeneralInstead of calling AllocConsole in Main, call it from where ...mentorDaveyM6928 May '10 - 8:05 
GeneralHow to attach a console when application is already launched...memberMaheshBagul28 May '10 - 2:09 
GeneralI do it my waymemberPIEBALDconsult2 Mar '11 - 15:28 
GeneralTo Developer who are discourage people by giving less pointmemberKhaniya2 Apr '10 - 0:22 
GeneralRe: To Developer who are discourage people by giving less pointmvpDaveyM692 Apr '10 - 1:25 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web01 | 2.6.130516.1 | Last Updated 7 Feb 2012
Article Copyright 2010 by DaveyM69
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid