web-dev-qa-db-de.com

Ausführen einer C # -Konsolenanwendung mit ausgeblendeter Konsole

Gibt es eine Möglichkeit, das Konsolenfenster beim Ausführen einer Konsolenanwendung auszublenden?

Ich verwende derzeit eine Windows Forms-Anwendung, um einen Konsolenprozess zu starten, möchte jedoch nicht, dass das Konsolenfenster angezeigt wird, während die Aufgabe ausgeführt wird.

134
Aaron Thomas

Wenn Sie die Klasse ProcessStartInfo verwenden, können Sie den Fensterstil auf "ausgeblendet" setzen. Bei Konsolenanwendungen (nicht GUI-Anwendungen) müssen Sie CreateNoWindow auf true setzen:

System.Diagnostics.ProcessStartInfo start =
      new System.Diagnostics.ProcessStartInfo();
start.FileName = dir + @"\Myprocesstostart.exe";
start.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; //Hides GUI
start.CreateNoWindow = true; //Hides console
151
Adam Markowitz

Wenn Sie die Konsolenanwendung geschrieben haben, können Sie sie standardmäßig ausblenden.

Erstellen Sie eine neue Konsolen-App und ändern Sie den Typ "Ausgabetyp" in "Windows-Anwendung" (in den Projekteigenschaften festgelegt).

187
Simon

Wenn Sie Process Class verwenden, können Sie schreiben

yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;

vor yourprocess.start(); und process werden ausgeblendet

67
nld

Die einfache Antwort lautet: Wechseln Sie zu den Eigenschaften Ihrer Konsolenanwendung (Projekteigenschaften). Ändern Sie auf der Registerkarte "Anwendung" einfach den "Ausgabetyp" in "Windows-Anwendung". Das ist alles.

41
Cihan

Sie können die FreeConsole API verwenden, um die Konsole vom Prozess zu trennen:

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

(Dies gilt natürlich nur, wenn Sie Zugriff auf den Quellcode der Konsolenanwendung haben.)

20
Thomas Levesque

Wenn Sie an der Ausgabe interessiert sind, können Sie diese Funktion verwenden:

private static string ExecCommand(string filename, string arguments)
{
    Process process = new Process();
    ProcessStartInfo psi = new ProcessStartInfo(filename);
    psi.Arguments = arguments;
    psi.CreateNoWindow = true;
    psi.RedirectStandardOutput = true;
    psi.RedirectStandardError = true;
    psi.UseShellExecute = false;
    process.StartInfo = psi;

    StringBuilder output = new StringBuilder();
    process.OutputDataReceived += (sender, e) => { output.AppendLine(e.Data); };
    process.ErrorDataReceived += (sender, e) => { output.AppendLine(e.Data); };

    // run the process
    process.Start();

    // start reading output to events
    process.BeginOutputReadLine();
    process.BeginErrorReadLine();

    // wait for process to exit
    process.WaitForExit();

    if (process.ExitCode != 0)
        throw new Exception("Command " + psi.FileName + " returned exit code " + process.ExitCode);

    return output.ToString();
}

Es führt das angegebene Befehlszeilenprogramm aus, wartet, bis es beendet ist, und gibt die Ausgabe als Zeichenfolge zurück.

7
JCH2k

Wenn Sie ein Programm erstellen, für das keine Benutzereingaben erforderlich sind, können Sie es immer nur als Dienst erstellen. Ein Dienst zeigt keine Art von Benutzeroberfläche an.

4
Chris Bregg

Ich weiß, dass ich nicht genau antworte, was Sie wollen, aber ich frage mich, ob Sie die richtige Frage stellen.

Warum benutzt du auch nicht:

  1. windows-Service
  2. erstelle einen neuen Thread und starte deinen Prozess darauf

Das klingt nach besseren Optionen, wenn Sie nur einen Prozess ausführen möchten.

1
Nathan Koop

Basierend auf der obigen Antwort von Adam Markowitz hat Folgendes für mich funktioniert:

process = new Process();
process.StartInfo = new ProcessStartInfo("cmd.exe", "/k \"" + CmdFilePath + "\"");
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
//process.StartInfo.UseShellExecute = false;
//process.StartInfo.CreateNoWindow = true;
process.Start();
1
Volcan Baru

Fügen Sie dies Ihrer Klasse hinzu, um die DLL Datei zu importieren:

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

    const int SW_HIDE = 0;
    const int SW_SHOW = 5;

Und wenn Sie es dann ausblenden möchten, verwenden Sie diesen Befehl:

var handle = GetConsoleWindow();
ShowWindow(handle, SW_HIDE);

Und wenn Sie die Konsole anzeigen möchten:

var handle = GetConsoleWindow();
ShowWindow(handle, SW_SHOW);
1
IDK anything

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

Fügen Sie diese Klasse einfach in Ihr Projekt ein 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 meine Konsole nicht ausgeblendet werden. Dies liegt möglicherweise daran, dass 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. ;)

1
Lucas Jarrett

Obwohl Sie, wie andere Antworten hier bereits sagten, den "Ausgabetyp" in "Windows-Anwendung" ändern können, müssen Sie beachten, dass dies bedeutet, dass Sie Console.In Nicht verwenden können, da dies zu einem NullStreamReader wird.

Console.Out Und Console.Error Scheinen jedoch weiterhin gut zu funktionieren.

0
kjbartel

Einfach schreiben

ProcessStartInfo psi= new ProcessStartInfo("cmd.exe");
......

psi.CreateNoWindow = true;
0
Navin