我在谷歌上搜索如何隐藏自己的控制台窗口的信息。令人惊讶的是,我能找到的唯一解决方案是使用FindWindow()根据标题查找控制台窗口的俗气解决方案。我深入研究了一下Windows API,发现有一种更好更简单的方法,所以我想把它贴在这里,让其他人找到。

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


当前回答

根据Timwi的回答,我已经创建了一个helper类来包装所需的代码:

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
    }
}

其他回答

方法如下:

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

只需转到应用程序的属性,并将输出类型从控制台应用程序更改为Windows应用程序。

根据Timwi的回答,我已经创建了一个helper类来包装所需的代码:

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
    }
}

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

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

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

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

而不是主机。你可以在最后使用new ManualResetEvent(false). waitone()来保持应用程序运行。