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


190

我到处搜索有关如何隐藏自己的控制台窗口的信息。令人惊讶的是,我能找到的唯一解决方案是骇人听闻的解决方案,其中涉及按其标题FindWindow()查找控制台窗口。我对Windows API进行了更深入的研究,发现有一种更好,更轻松的方法,因此我想将其发布在这里,供其他人查找。

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

Answers:


265

这是如何做:

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

14
该窗口仍会在开始时暂时出现。我想没有办法解决,除非应用程序类型改变了?
Ciaran Gallagher

2
如果有解决办法,那将是很好。这样,当我处于调试模式时,我可以显示控制台,但是当我处于正常运行模式时,只需运行程序并退出(无窗口)即可。
瓦卡诺2011年

8
@Vaccano:只有通过csproj手动编辑文件,才有可能使您的应用程序在“调试”模式下成为控制台应用程序。Visual Studio没有GUI可以执行此操作,但是如果您csproj正确地编辑文件,它将接受该设置。
Timwi'8

3
需要:using System.Runtime.InteropServices;
安东尼·尼科尔斯

5
这是一个很好的答案,但我可能会添加一个选项const int SW_SHOWMINIMIZED = 2;,然后添加,ShowWindow(handle, SW_SHOWMINIMIZED); 这样控制台就不会隐藏,只是最小化了。
KansaiRobot

264

只需转到应用程序的属性,然后将输出类型Console Application更改为Windows Application即可


9
即使这不能回答OP的问题,也非常感谢您提供此答案。正是我所需要的:)
kayleeFrye_onDeck 2014年

6
这不是解决方案,因为这种方式无法显示窗口。
米哈尔沃林斯基

6
这不是发布者要求的解决方案。
KansaiRobot

1
虽然很棒,但该解决方案不允许您以编程方式控制何时显示和隐藏控制台。假设您接受一个控制台参数,设置该参数后您想要隐藏控制台(即,静音模式,详细= False)
TheLegendaryCopyCoder

3
当您要在后台更新主可执行文件然后运行它时,这非常有用。谢谢
Ehsan

22

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

我建议将项目输出类型设置为Windows应用程序而不是控制台应用程序。它不会显示控制台窗口,但会执行所有操作,例如控制台应用程序。


28
因为可能会有一段时间我确实想展示它。就像,控制台应用程序尝试执行操作,只要成功就不会打扰任何人。如果没有,它将弹出并提供给我一个CLI。
Janis F

TopShelf允许您将其Consoles作为服务来运行,这打破了
Heelis先生

如果要在控制台中使用标准输出,则需要一个控制台,就这么简单。
Totte Karlsson

20

您可以进行相反的操作,并将“应用程序”输出类型设置为: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


它确实显示了带有闪烁光标的控制台,但是在我的情况下,Console.WriteLine(“ text”)和standardOutput.WriteLine(“ text”)均不显示任何内容。缺少什么吗?
罗尼·德·霍尔

9

在这里查看我的帖子:

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

您可以制作Windows应用程序(有或没有窗口)并根据需要显示控制台。使用此方法,除非您明确显示控制台窗口,否则它不会出现。我将其用于双模式应用程序,这些应用程序要根据其打开方式在控制台或GUI模式下运行。


优秀的!隐藏控制台的最简单方法是将项目类型更改为Windows应用程序。

4

“只要隐藏”,您可以:

将输出类型从Console Application更改为Windows Application

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


1

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

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

我们必须在DllImport(“ fullPath”)中提供dll文件的完整路径/
Tushar Gupta-curioustushar 2013年

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";
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.