显示/隐藏C#控制台应用程序的控制台窗口

我search了一些关于如何隐藏自己的控制台窗口的信息。 令人惊讶的是,我能find的唯一解决scheme是hacky解决scheme,它涉及FindWindow() 通过标题find控制台窗口。 我深入了解Windows API,发现有一个更好更简单的方法,所以我想把它发布到这里供其他人查找。

你如何隐藏(和显示)与我自己的C#控制台应用程序相关的控制台窗口?

就是这样:

 using System.Runtime.InteropServices; 

 [DllImport("kernel32.dll")] static extern IntPtr GetConsoleWindow(); [DllImport("user32.dll")] static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); const int SW_HIDE = 0; const int SW_SHOW = 5; 

 var handle = GetConsoleWindow(); // Hide ShowWindow(handle, SW_HIDE); // Show ShowWindow(handle, SW_SHOW); 

只需转到应用程序的“ 属性”,然后将“ 输出”types从“ 控制台应用程序”更改为“

为什么你需要一个控制台应用程序,如果你想隐藏控制台本身? =)

我build议将Project Outputtypes设置为Windows应用程序而不是Console应用程序。 它不会显示你的控制台窗口,但执行所有的操作,如控制台应用程序。

您可以执行反转并将应用程序输出types设置为:Windows应用程序。 然后将此代码添加到应用程序的开始。

 [DllImport("kernel32.dll", EntryPoint = "GetStdHandle", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern IntPtr GetStdHandle(int nStdHandle); [DllImport("kernel32.dll", EntryPoint = "AllocConsole", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern int AllocConsole(); private const int STD_OUTPUT_HANDLE = -11; private const int MY_CODE_PAGE = 437; private static bool showConsole = true; //Or false if you don't want to see the console static void Main(string[] args) { if (showConsole) { AllocConsole(); IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE); Microsoft.Win32.SafeHandles.SafeFileHandle safeFileHandle = new Microsoft.Win32.SafeHandles.SafeFileHandle(stdHandle, true); FileStream fileStream = new FileStream(safeFileHandle, FileAccess.Write); System.Text.Encoding encoding = System.Text.Encoding.GetEncoding(MY_CODE_PAGE); StreamWriter standardOutput = new StreamWriter(fileStream, encoding); standardOutput.AutoFlush = true; Console.SetOut(standardOutput); } //You're application code } 

如果showConsoletrue则此代码将显示控制台

在这里看到我的post:

在Windows应用程序中显示控制台

您可以制作Windows应用程序(带或不带窗口)并根据需要显示控制台。 使用这种方法,控制台窗口不会出现,除非你明确地显示它。 我将其用于双模式应用程序,我想要在控制台或GUI模式下运行,具体取决于它们是如何打开的。

如果你不想依靠窗口标题使用这个:

  [DllImport("user32.dll")] static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

  IntPtr h = Process.GetCurrentProcess().MainWindowHandle; ShowWindow(h, 0); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FormPrincipale()); 

如果您在集成小批量应用程序时没有问题,则可以使用名为Cmdow.exe的程序,该程序将允许您根据控制台标题隐藏控制台窗口。

 Console.Title = "MyConsole"; System.Diagnostics.Process HideConsole = new System.Diagnostics.Process(); HideConsole.StartInfo.UseShellExecute = false; HideConsole.StartInfo.Arguments = "MyConsole /hid"; HideConsole.StartInfo.FileName = "cmdow.exe"; HideConsole.Start(); 

将该exe文件添加到解决scheme中,将构build操作设置为“内容”,将“复制到输出目录”设置为适合您的内容,cmdow将在运行时隐藏控制台窗口。

要使控制台再次可见,只需更改参数

 HideConsole.StartInfo.Arguments = "MyConsole /Vis";