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

问题描述 投票:0回答:10

我在谷歌上搜索了有关如何隐藏自己的控制台窗口的信息。令人惊讶的是,我能找到的唯一解决方案是一些黑客解决方案,其中涉及

FindWindow()
通过其标题找到控制台窗口。我对 Windows API 进行了更深入的研究,发现有一种更好、更简单的方法,所以我想将其发布在这里供其他人查找。

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

c# console console-application
10个回答
370
投票
如果您只想让应用程序完全在无头模式(没有 GUI)下运行,请通过

Project -> Properties 转到应用程序的 Properties 菜单,并将 Output typeConsole Application 更改为 Windows应用

Screenshot of application properties window showing the Output type of


346
投票
具体方法如下:

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);
    

27
投票
您可以执行相反的操作,并将应用程序输出类型设置为: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); } //Your application code }

如果

showConsole

true
,此代码将显示控制台
    


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

我建议将项目输出类型设置为

Windows 应用程序,而不是控制台应用程序。它不会显示控制台窗口,但会执行所有操作,就像控制台应用程序一样。


13
投票
请参阅我的帖子:

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

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


12
投票
“只是为了隐藏”你可以:

将输出类型从

控制台应用程序更改为 Windows 应用程序

并且您可以在最后使用

Console.Readline/key

 来代替 
new ManualResetEvent(false).WaitOne()
 来保持应用程序运行。


9
投票
根据

Timwi 的回答,我创建了一个辅助类来包装所需的代码:

using System; using System.Runtime.InteropServices; static class ConsoleExtension { const int SW_HIDE = 0; const int SW_SHOW = 5; readonly static IntPtr handle = GetConsoleWindow(); [DllImport("kernel32.dll")] static extern IntPtr GetConsoleWindow(); [DllImport("user32.dll")] static extern bool ShowWindow(IntPtr hWnd,int nCmdShow); public static void Hide() { ShowWindow(handle,SW_HIDE); //hide the console } public static void Show() { ShowWindow(handle,SW_SHOW); //show the console } }
    

2
投票
如果您不想依赖于窗口标题,请使用此:

[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());
    

1
投票
要在使用 csc 编译器时将输出类型从控制台应用程序更改为 Windows 应用程序,请将

-target:winexe

 添加到 csc.exe 命令中,如下所示:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe -out:example.exe -target:winexe example.cs

    


0
投票
如果您在集成小批量应用程序时没有问题,有一个名为

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添加到解决方案中,将构建操作设置为“内容”,将“复制到输出目录”设置为适合您的内容,cmdow将在运行时隐藏控制台窗口。

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

HideConsole.StartInfo.Arguments = "MyConsole /Vis";
    
© www.soinside.com 2019 - 2024. All rights reserved.