[C#] 顯示/隱藏C#控制台應用程序的控制台窗口


Answers

只需轉到應用程序的“ 屬性”並將“ 輸出”類型從“ 控制台應用程序”更改為“ Windows應用程序

Question

我搜索了解如何隱藏自己的控制台窗口的信息。 令人驚訝的是,我能找到的唯一解決方案是涉及FindWindow() hacky解決方案, 通過它的標題找到控制台窗口。 我深入了解Windows API,發現有更好更簡單的方法,所以我想將它發佈到這裡供其他人查找。

你如何隱藏(並顯示)與我自己的C#控制台應用程序相關的控制台窗口?




如果你不想依靠窗口標題使用這個:

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



您可以執行反轉並將應用程序輸出類型設置為: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
}

如果showConsoletrue此代碼將顯示控制台