【问题标题】:Show/Hide the console window of a C# console application显示/隐藏 C# 控制台应用程序的控制台窗口
【发布时间】:2011-04-04 01:15:06
【问题描述】:

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

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

【问题讨论】:

    标签: c# console console-application


    【解决方案1】:

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

    【讨论】:

    • 尽管这不能回答 OP 的问题,但我非常感谢您给出这个答案。这正是我所需要的:)
    • 这不是解决方案,因为这样窗口无法显示。
    • 这不是发帖者所要求的解决方案。
    • 虽然很棒,但此解决方案不允许您以编程方式控制何时显示和隐藏控制台。假设您接受一个控制台参数,当设置时您想隐藏您的控制台(即静默模式,verbose=false)
    • @Lenny:这是可行的,因为 GUI 应用程序不会打开控制台窗口。为了显示一个窗口,每个 GUI 应用程序都会创建一个窗口然后显示它。由于以前的控制台应用程序缺少创建窗口的代码,因此不会显示任何窗口。我在另一个“闹钟”(定时器)类型的应用程序中使用了这个原理。首先我显示一个“设置参数窗口”,关闭窗口(不是隐藏,而是关闭)。随着计时器的流逝,会显示一个新窗口。
    【解决方案2】:

    方法如下:

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

    【讨论】:

    • 窗口仍然在开始时短暂出现。我想没有办法解决这个问题,除非更改应用程序类型?
    • 如果有办法解决这个问题就好了。这样我可以在调试模式下显示控制台,但在正常运行模式下运行我的程序并退出(没有窗口)。
    • @Vaccano:只有通过手动编辑csproj 文件,才能使您的应用程序成为调试模式下的控制台应用程序。 Visual Studio 没有 GUI 来执行此操作,但如果您正确编辑 csproj 文件,它将遵循该设置。
    • 需要:using System.Runtime.InteropServices;
    • 这是一个非常好的答案,但我可能会补充一点,要添加的另一个选项是const int SW_SHOWMINIMIZED = 2;,然后是ShowWindow(handle, SW_SHOWMINIMIZED);,这样控制台开始时不会隐藏,只是最小化。
    【解决方案3】:

    您可以反过来将应用程序输出类型设置为: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,此代码将显示控制台

    【讨论】:

    • 它确实显示了带有闪烁光标的控制台,但在我的情况下,Console.WriteLine("text") 和 standardOutput.WriteLine("text") 都没有显示任何内容。有什么遗漏吗?
    【解决方案4】:

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

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

    【讨论】:

    • 因为可能会有一段时间我真的想展示它。就像,控制台应用程序尝试执行某些操作,只要成功就不会打扰任何人。如果没有,它会弹出并为我提供 CLI。
    • TopShelf 允许您将 Consoles 作为服务运行,这会破坏
    • 如果您希望标准输出在控制台中可用,那么您将需要一个控制台,就这么简单。
    • 一些 GUI 应用程序仍然可以从控制台运行,并且很高兴在控制台中显示输出。
    【解决方案5】:

    在这里查看我的帖子:

    Show Console in Windows Application

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

    【讨论】:

    • 太棒了!隐藏控制台最简单的方法是将项目类型更改为 Windows 应用程序。
    【解决方案6】:

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

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

    您可以在末尾使用new ManualResetEvent(false).WaitOne() 而不是Console.Readline/key 来保持应用运行。

    【讨论】:

      【解决方案7】:

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

          [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 文件的完整路径
      【解决方案8】:

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

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

      【讨论】:

        【解决方案9】:

        如果您在集成小批量应用程序时没有问题,有一个名为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";
        

        【讨论】:

          猜你喜欢
          • 2011-04-20
          • 2017-08-03
          • 2016-03-30
          • 2019-01-18
          • 1970-01-01
          • 1970-01-01
          • 2012-08-02
          • 2011-07-19
          相关资源
          最近更新 更多