Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中隐藏控制台应用程序#_C#_Console Application_Hide - Fatal编程技术网

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

C# 如何在C中隐藏控制台应用程序#,c#,console-application,hide,C#,Console Application,Hide,我在C#中有一个控制台应用程序,我希望用户不能看到它 我该怎么做 您可以Pinvoke调用FindWindow()来获取窗口的句柄,然后调用ShowWindow()来隐藏窗口 或 使用ProcessStartInfo.CreateNoWindow从另一个应用程序启动应用程序,并将其编译为Windows窗体应用程序。如果您没有显式打开任何窗口,它将不会显示任何UI。听起来您不需要控制台应用程序,而是不打开(可见)窗口的Windows GUI应用程序。使用以下代码创建控制台应用程序“MyAppPro

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


我该怎么做

您可以Pinvoke调用FindWindow()来获取窗口的句柄,然后调用ShowWindow()来隐藏窗口 或
使用ProcessStartInfo.CreateNoWindow从另一个应用程序启动应用程序,并将其编译为Windows窗体应用程序。如果您没有显式打开任何窗口,它将不会显示任何UI。

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

使用以下代码创建控制台应用程序“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();
}

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

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

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

        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();
参见其他可能的解决方案-

以及


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

若要在C中隐藏控制台应用程序,请在没有其他功能时使用以下代码:

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

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

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

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);
        }
    }
}
只需将这个类包括在项目中,并调用
magicer.discosearconsole()

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

我这样做是为了一个不和谐的机器人,它作为一个不可见的进程永远在我的计算机后台运行。这比让托普舍夫为我工作容易多了。在我写这篇文章之前,在其他地方找到的代码的帮助下,有几篇TopShelf教程让我失败了;P

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


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

这是一个你想在后台运行的服务吗?是的,但我不想作为服务运行,我想作为一个.exe运行。应用程序将如何启动?自动地,从启动目录。还有一种方法。我不知道这是否可行,但它确实读起来很有趣!)调用ShowWindow()将其隐藏…;)我更喜欢的是,这可能是实现这一点最常见、最简单的方法,而不是哈克的
FindWindow()
解决方案。为什么要更改整个基线而不显示控制台窗口?不是最好的主意。@Nayan,不需要任何设计变更。没有人说您应该实现任何接口或引用任何程序集。它只是切换编译模式,实际上只是在程序集中设置一个标志“我是一个控制台程序”与“我是一个Windows程序”。事实上,您可以编译为Windows程序,而无需引用mscorlib以外的任何内容。@driis,如果我能对您的答案投100票的话。那家伙真厉害!!真不敢相信我从来没有想到这一点,这么简单+1这是做这件事的方法。秘密是CreateNoWindow属性。我认为这是误导性的,完全是错误的方向。隐藏应用的用途可能与wcf服务完全不同。这似乎比仅仅这样做有点狡猾。当您使用FreeConsole()将进程与其控制台分离时,控制台将终止。您必须记住在工作完成时终止流程,因为没有控制台可以为您执行此操作,除非我遗漏了什么(如果遗漏了,请让我知道)。不过,这是一个非常简洁的方法。