关于C#控制台程序中分离并关闭控制台窗口的说明

一、根据Win32 API定义控制台分离函数:

/// <summary>
/// 分离与调用进程相关联的控制台
/// </summary>
/// <returns>返回分离是否成功</returns>
[DllImport("kernel32.dll")]
public static extern bool FreeConsole();

二、分离并关闭控制台窗口:
调用函数“FreeConsole”后,程序进程就可以将其自身从其控制台分离,而如果当前控制台没有其他进程与之链接时,该控制台窗口就会被关闭。当然在进程调用FreeConsole函数之后,它仍旧可以调用Win32 API中的AllocConsole函数来创建一个新的控制台或AttachConsole函数来附加到另一个控制台。

关于C#控制台程序中显示或隐藏控制台窗口的说明

一、根据Win32 API定义窗口相关函数:

/// <summary>
/// 查找窗口句柄
/// </summary>
/// <param name="lpClassName">类名</param>
/// <param name="lpWindowName">窗口名</param>
/// <returns>返回查找到的窗口句柄</returns>
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

/// <summary>
/// 显示或隐藏窗口
/// </summary>
/// <param name="hWnd">窗口句柄</param>
/// <param name="nCmdShow">0为隐藏,1为显示</param>
/// <returns>返回显示或隐藏是否成功</returns>
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

二、设置控制台窗口的显示或隐藏:

/// <summary>
/// 设置控制台窗口是否显示
/// </summary>
/// <param name="visible">是否显示</param>
public static void SetConsoleWindowVisible(bool visible)
{
    // 查找控制台窗口句柄
    IntPtr hWnd = FindWindow(null, Console.Title);
    // 判断是否找到控制台窗口句柄
    if (hWnd != IntPtr.Zero)
    {
        // 设置控制台窗口显示或隐藏
        if (visible)
        {
            ShowWindow(hWnd, 1);
        }
        else
        {
            ShowWindow(hWnd, 0);
        }
    }
}