如何在 C# 中隐藏控制台应用程序

Posted

技术标签:

【中文标题】如何在 C# 中隐藏控制台应用程序【英文标题】:How to hide a console application in C# 【发布时间】:2011-02-15 08:38:40 【问题描述】:

我有一个 C# 控制台应用程序,我希望用户看不到它。

我该怎么做?

【问题讨论】:

它是你想在后台运行的服务吗? 是的,但我不想作为服​​务运行它,我想将它作为.exe运行 应用程序将如何启动? 自动,从启动目录。 还有show and hide the console window while the program is running的方法。 【参考方案1】:

我有一个通用的解决方案要分享:

using System;
using System.Runtime.InteropServices;

namespace WhateverNamepaceYouAreUsing

    class Magician
    
    [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        const int HIDE = 0;
        const int SHOW = 5;

        public static void DisappearConsole()
        
            ShowWindow(GetConsoleWindow(), HIDE);
        
    

只需将此类包含在您的项目中,然后调用Magician.DisappearConsole();

当您通过单击启动程序时,控制台将闪烁。从命令提示符执行时,命令提示符在执行后很快消失。

我这样做是为了一个 Discord Bot,它作为一个不可见的进程在我的计算机后台永远运行。这比让 TopShelf 为我工作更容易。在我在其他地方找到的代码的帮助下写这篇文章之前,一些 TopShelf 教程让我失望了。 ;P

我还尝试简单地更改 Visual Studio > 项目 > 属性 > 应用程序中的设置以作为 Windows 应用程序而不是控制台应用程序启动,并且我的项目的某些内容阻止了它隐藏我的控制台 - 可能是因为 DSharpPlus 要求启动一个启动时控制台。我不知道。不管是什么原因,这个类让我可以在控制台弹出后轻松杀死它。

希望这位魔术师能帮助别人。 ;)

【讨论】:

【参考方案2】:

若要在 C# 中隐藏控制台应用程序,请使用以下代码:

[DllImport("kernel32.dll")]
public static extern bool FreeConsole();

将 FreeConsole() 放在代码的任意位置,我放在 Init() 中,命令行被隐藏了。

【讨论】:

这似乎比仅仅这样做有点棘手。当您使用 FreeConsole() 将进程与其控制台分离时,控制台将终止。您必须记住在工作完成后终止该过程,因为没有控制台可以为您执行此操作,除非我遗漏了某些东西(如果我这样做了,请告诉我)。不过,这是一种非常巧妙的方法。【参考方案3】:

在 ProjectProperties 上将输出类型设置为 Windows 应用程序。

【讨论】:

【参考方案4】:

最好的方法是在没有窗口的情况下启动进程。

        Process p = new Process();
        p.StartInfo.FileName = "cmd.exe";
        p.StartInfo.Arguments = "echo Hello!";
        //either..
        p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        //or..
        p.StartInfo.CreateNoWindow = true;
        p.Start();

查看其他可能的解决方案 -

Toggle Process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden at runtime

和,

Bring another processes Window to foreground when it has ShowInTaskbar = false

【讨论】:

【参考方案5】:

创建一个 wcf 服务并根据需要托管它。

【讨论】:

我认为这是误导性的,而且完全是错误的方向。隐藏应用的用途可能与 wcf 服务完全不同。【参考方案6】:

使用以下代码创建一个控制台应用程序“MyAppProxy”,并将 MyAppProxy 放在启动目录中,

public static void main(string[] args)

   Process p = new Process("MyApp");
   ProcessStartUpInfo pinfo = new ProcessStartUpInfo();
   p.StartupInfo = pinfo;
   pinfo.CreateNoWindow = true;
   pinfo.ShellExecute = false;

   p.RaiseEvents = true;

   AutoResetEvent wait = new AutoResetEvent(false);
   p.ProcessExit += (s,e)=> wait.Set(); ;

   p.Start();
   wait.WaitOne();

您可能需要在此处修复某些项目,因为我没有检查代码的正确性,它可能无法编译,因为某些属性名称可能不同,但希望您明白。

【讨论】:

这就是这样做的方法。秘密是 CreateNoWindow 属性。【参考方案7】:

听起来您不想要一个控制台应用程序,而是一个不打开(可见)窗口的 Windows GUI 应用程序。

【讨论】:

【参考方案8】:

将其编译为 Windows 窗体应用程序。如果您没有明确打开任何 Windows,它将不会显示任何 UI。

【讨论】:

这可能是最常见和最简单的方法。 并非如此。为什么要更改整个基线而不是显示控制台窗口?不是最好的主意。 @Nayan,不需要任何设计更改。没有人说您应该实现任何接口或引用任何程序集。它只是切换编译模式,实际上只是在程序集中设置一个标志为“我是控制台程序”与“我是 Windows 程序”。事实上,您可以编译为 Windows 程序,而无需引用 mscorlib 以外的任何其他内容。 @driis,如果我能给你的答案投票 100 次。震撼的男人!! 我不敢相信我从来没有想过这个,这么简单。 +1【参考方案9】:

您可以 Pinvoke 调用 FindWindow() 来获取窗口的句柄,然后调用 ShowWindow() 来隐藏窗口 要么 使用 ProcessStartInfo.CreateNoWindow 从另一个应用程序启动您的应用程序

【讨论】:

我不知道这是否有效,但它确实读起来很有趣! :) 调用 ShowWindow() 将其隐藏... ;) 我更喜欢retrieving the console handle properly而不是hacky FindWindow()解决方案...

以上是关于如何在 C# 中隐藏控制台应用程序的主要内容,如果未能解决你的问题,请参考以下文章

C#新进程窗口不隐藏[重复]

如何隐藏随我的应用程序打开的控制台窗口?

在 C# 的代码隐藏中创建具有值的表脚本

c# .NEt 3.5 以用户形式运行进程时无法隐藏 CMD 窗口 - 窗体应用程序

如何使用 c# 在 asp.net 中隐藏和显示警报

如何在 C# Web 表单应用程序的回发时保持侧导航栏隐藏?