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.
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
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).
Wenn Sie Process Class verwenden, können Sie schreiben
yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;
vor yourprocess.start();
und process werden ausgeblendet
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.
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.)
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.
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.
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:
Das klingt nach besseren Optionen, wenn Sie nur einen Prozess ausführen möchten.
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();
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);
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. ;)
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.
Einfach schreiben
ProcessStartInfo psi= new ProcessStartInfo("cmd.exe");
......
psi.CreateNoWindow = true;