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

Show/Hide the console window of a C# console application

我到处搜索如何隐藏自己控制台窗口的信息。令人惊讶的是,我能找到的唯一解决方案是hacky解决方案,它涉及到FindWindow(),通过其标题找到控制台窗口。我在windows api中深入研究了一点,发现有一种更好更简单的方法,所以我想把它发布到这里,让其他人找到。

如何隐藏(并显示)与我自己的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
}

如果showConsoletrue时,此代码将显示控制台。


在这里查看我的帖子:

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

您可以创建一个Windows应用程序(有窗口或无窗口),并根据需要显示控制台。使用此方法,除非显式显示控制台窗口,否则不会显示该窗口。我将它用于双模应用程序,我想在控制台或GUI模式下运行,这取决于它们是如何打开的。


"只是为了隐藏",你可以:

将输出类型从控制台应用程序更改为Windows应用程序,

而不是Console.Readline/key,你可以在最后使用new ManualResetEvent(false).WaitOne()来保持应用程序的运行。


如果您不想依赖窗口标题,请使用:

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