Show/Hide the console window of a C# console application
我到处搜索如何隐藏自己控制台窗口的信息。令人惊讶的是,我能找到的唯一解决方案是hacky解决方案,它涉及到
如何隐藏(并显示)与我自己的C控制台应用程序关联的控制台窗口?
以下是如何:
1 | using System.Runtime.InteropServices; |
1 2 3 4 5 6 7 8 | [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; |
1 2 3 4 5 6 7 | var handle = GetConsoleWindow(); // Hide ShowWindow(handle, SW_HIDE); // Show ShowWindow(handle, SW_SHOW); |
只需转到应用程序的属性并将输出类型从控制台应用程序更改为Windows应用程序。
如果要隐藏控制台本身,为什么需要控制台应用程序?=)
我建议将项目输出类型设置为Windows应用程序,而不是控制台应用程序。它不会显示控制台窗口,而是执行所有操作,如控制台应用程序。
您可以执行相反的操作,并将应用程序输出类型设置为:Windows应用程序。然后将此代码添加到应用程序的开头。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | [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); } //Your application code } |
如果
在这里查看我的帖子:
在Windows应用程序中显示控制台
您可以创建一个Windows应用程序(有窗口或无窗口),并根据需要显示控制台。使用此方法,除非显式显示控制台窗口,否则不会显示该窗口。我将它用于双模应用程序,我想在控制台或GUI模式下运行,这取决于它们是如何打开的。
"只是为了隐藏",你可以:
将输出类型从控制台应用程序更改为Windows应用程序,
而不是
如果您不想依赖窗口标题,请使用:
1 2 | [DllImport("user32.dll")] static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); |
…
1 2 3 4 5 | IntPtr h = Process.GetCurrentProcess().MainWindowHandle; ShowWindow(h, 0); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FormPrincipale()); |
如果在集成小批量应用程序时没有问题,那么有一个名为Cmdow.exe的程序,它允许您根据控制台标题隐藏控制台窗口。
1 2 3 4 5 6 | 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添加到解决方案中,将build操作设置为"content",将copy to output目录设置为适合您的目录,当运行控制台窗口时,cmdow将隐藏该窗口。
要使控制台再次可见,只需更改参数
1 | HideConsole.StartInfo.Arguments ="MyConsole /Vis"; |