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

时间:2010-08-26 02:19:38

标签: c# console console-application

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

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

8 个答案:

答案 0 :(得分:228)

以下是:

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

答案 1 :(得分:223)

只需转到应用程序的属性,然后将输出类型控制台应用程序更改为 Windows应用程序。< / p>

答案 2 :(得分:21)

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

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

答案 3 :(得分:15)

您可以执行相反的操作并将Application输出类型设置为:Windows Application。然后将此代码添加到应用程序的开头。

[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

,此代码将显示控制台

答案 4 :(得分:9)

请在此处查看我的帖子:

Show Console in Windows Application

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

答案 5 :(得分: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());

答案 6 :(得分:1)

“只需​​隐藏”即可:

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

您可以在末尾使用Console.Readline/key来代替new ManualResetEvent(false).WaitOne(),以保持应用程序的运行。

答案 7 :(得分: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添加到解决方案中,将构建操作设置为“Content”,将Copy to Output Directory设置为适合您的内容,cmdow将在运行时隐藏控制台窗口。

要再次显示控制台,只需更改参数

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