web-dev-qa-db-ger.com

So verbergen Sie eine Konsolenanwendung in C #

Ich habe eine Konsolenanwendung in C # und möchte, dass der Benutzer sie nicht sehen kann.

Wie kann ich das machen?

26
menacheb

Kompilieren Sie es als Windows Forms-Anwendung. Dann wird keine Benutzeroberfläche angezeigt, wenn Sie kein Windows explizit öffnen.

52
driis

Legen Sie in ProjectProperties den Ausgabetyp als Windows-Anwendung fest.

16
Nico.S

Klingt so, als wollten Sie keine Konsolenanwendung, sondern eine Windows-GUI-Anwendung, die kein (sichtbares) Fenster öffnet.

5
peSHIr

Erstellen Sie eine Konsolenanwendung "MyAppProxy" mit folgendem Code und legen Sie MyAppProxy im Startverzeichnis ab.

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

Möglicherweise müssen Sie bestimmte Elemente hier korrigieren, da ich die Richtigkeit des Codes nicht überprüft habe. Möglicherweise wird der Code nicht kompiliert, da einige Eigenschaftsnamen möglicherweise unterschiedlich sind.

4
Akash Kava

Am besten starten Sie den Vorgang ohne Fenster.

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

Andere wahrscheinliche Lösungen anzeigen -

Process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden zur Laufzeit umschalten

und,

Bringe ein anderes Prozessfenster in den Vordergrund, wenn es ShowInTaskbar = false hat

2
Nayan

Verwenden Sie diesen Code, um eine Konsolenanwendung in C # auszublenden, wenn nichts anderes funktioniert:

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

Platziere FreeConsole () irgendwo im Code, ich habe es in Init () platziert und die Kommandozeile ist ausgeblendet.

2
Quispie

Sie können einen Aufruf von FindWindow () anheften, um ein Handle für Ihr Fenster zu erhalten, und dann ShowWindow () aufrufen, um das Fenster auszublenden. OR Starten Sie Ihre Anwendung mit ProcessStartInfo.CreateNoWindow von einem anderen

1
Ovidiu Pacurar

Ich habe eine allgemeine Lösung zu teilen:

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

Nehmen Sie diese Klasse einfach in Ihr Projekt auf und rufen Sie Magician.DisappearConsole(); auf.

Eine Konsole blinkt, wenn Sie das Programm durch Anklicken starten. Bei der Ausführung über die Eingabeaufforderung wird die Eingabeaufforderung kurz nach der Ausführung ausgeblendet.

Ich mache das für einen Discord Bot, der für immer im Hintergrund meines Computers als unsichtbarer Prozess läuft. Es war einfacher, als TopShelf für mich arbeiten zu lassen. Ein paar TopShelf-Tutorials haben versagt, bevor ich dies mithilfe von Code geschrieben habe, den ich an anderer Stelle gefunden habe. ; P

Ich habe auch versucht, die Einstellungen in Visual Studio> Projekt> Eigenschaften> Anwendung einfach so zu ändern, dass sie als Windows-Anwendung anstelle einer Konsolenanwendung gestartet werden. Durch ein bestimmtes Projekt konnte die Konsole nicht ausgeblendet werden, möglicherweise weil DSharpPlus beim Start eine Konsole starten muss . Ich weiß es nicht. Was auch immer der Grund sein mag, mit dieser Klasse kann ich die Konsole nach dem Auftauchen einfach abschalten.

Hoffe dieser Magier hilft jemandem. ;)

0
Aiso Milele