Apakah ada cara untuk menyembunyikan jendela konsol saat menjalankan aplikasi konsol?
Saat ini saya menggunakan aplikasi Windows Forms untuk memulai proses konsol, tetapi saya tidak ingin jendela konsol ditampilkan saat tugas sedang berjalan.
Apakah ada cara untuk menyembunyikan jendela konsol saat menjalankan aplikasi konsol?
Saat ini saya menggunakan aplikasi Windows Forms untuk memulai proses konsol, tetapi saya tidak ingin jendela konsol ditampilkan saat tugas sedang berjalan.
Jawaban:
Jika Anda menggunakan ProcessStartInfo
kelas Anda dapat mengatur gaya jendela untuk disembunyikan - dalam kasus aplikasi konsol (bukan GUI), Anda harus mengatur CreateNoWindow ke true
:
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
Jika Anda menulis aplikasi konsol, Anda dapat membuatnya tersembunyi secara default.
Buat aplikasi konsol baru kemudian ubah tipe "Jenis Keluaran" menjadi "Aplikasi Windows" (dilakukan di properti proyek)
Jika Anda menggunakan Kelas Proses maka Anda dapat menulis
yourprocess.StartInfo.UseShellExecute = false;
yourprocess.StartInfo.CreateNoWindow = true;
sebelum yourprocess.start();
dan proses akan disembunyikan
Jawaban sederhananya adalah: Buka properti aplikasi konsol Anda (properti proyek). Di tab "Aplikasi", cukup ubah "Jenis keluaran" menjadi "Aplikasi Windows". Itu saja.
Anda dapat menggunakan API FreeConsole untuk melepaskan konsol dari proses:
[DllImport("kernel32.dll")]
static extern bool FreeConsole();
(tentu saja ini hanya berlaku jika Anda memiliki akses ke kode sumber aplikasi konsol)
FreeConsole
melakukan apa yang namanya, itu tidak mencegah Windows menampilkan konsol sebelum dipanggil.
[DllImport("kernel32.dll")] static extern bool AllocConsole();
memungkinkan Anda untuk dengan mudah menjalankan dengan konsol dari aplikasi Win32 standar
Jika Anda tertarik dengan hasilnya, Anda dapat menggunakan fungsi ini:
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();
}
Itu menjalankan program baris perintah yang diberikan, menunggu untuk menyelesaikan dan mengembalikan output sebagai string.
Jika Anda membuat program yang tidak memerlukan input pengguna, Anda selalu bisa membuatnya sebagai layanan. Layanan tidak akan menampilkan UI apa pun.
Tambahkan ini ke kelas Anda untuk mengimpor file DLL:
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
const int SW_HIDE = 0;
const int SW_SHOW = 5;
Dan kemudian jika Anda ingin menyembunyikannya gunakan perintah ini:
var handle = GetConsoleWindow();
ShowWindow(handle, SW_HIDE);
Dan jika Anda ingin menampilkan konsol:
var handle = GetConsoleWindow();
ShowWindow(handle, SW_SHOW);
Saya tahu saya tidak menjawab apa yang Anda inginkan, tetapi saya ingin tahu apakah Anda mengajukan pertanyaan yang tepat.
Mengapa tidak Anda gunakan:
Itu terdengar seperti opsi yang lebih baik jika semua yang Anda inginkan adalah menjalankan proses.
Meskipun seperti jawaban lain di sini yang mengatakan Anda dapat mengubah "tipe Output" ke "Aplikasi Windows", perlu diketahui bahwa ini berarti Anda tidak dapat menggunakannya Console.In
karena akan menjadi NullStreamReader.
Console.Out
dan Console.Error
tampaknya masih berfungsi dengan baik.
Console.In
ketika tidak ada konsol untuk memasukkan sesuatu? Dari mana datangnya sesuatu yang bisa diakses melalui Console.In
? Ini sama sekali tidak masuk akal. Dengan kata lain: Sangat jelas dan logis bahwa Console.In
ini adalah NullStreamReader
dalam kasus ini.
Berdasarkan jawaban Adam Markowitz di atas, berikut ini berhasil bagi saya:
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();
Saya punya solusi umum untuk dibagikan:
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);
}
}
}
Cukup sertakan kelas ini dalam proyek Anda, dan hubungi Magician.DisappearConsole();
.
Sebuah konsol akan berkedip ketika Anda memulai program dengan mengkliknya. Ketika mengeksekusi dari prompt perintah, prompt perintah menghilang sangat lama setelah eksekusi.
Saya melakukan ini untuk Discord Bot yang berjalan selamanya di latar belakang komputer saya sebagai proses yang tidak terlihat. Itu lebih mudah daripada membuat TopShelf bekerja untuk saya. Beberapa tutorial TopShelf gagal sebelum saya menulis ini dengan bantuan kode yang saya temukan di tempat lain. ; P
Saya juga mencoba mengubah pengaturan di Visual Studio> Proyek> Properti> Aplikasi untuk diluncurkan sebagai Aplikasi Windows, bukan Aplikasi Konsol, dan sesuatu tentang proyek saya mencegah hal ini menyembunyikan konsol saya - mungkin karena DSharpPlus menuntut untuk meluncurkan konsol saat startup . Saya tidak tahu Apa pun alasannya, kelas ini memungkinkan saya untuk dengan mudah membunuh konsol setelah itu muncul.
Semoga Penyihir ini membantu seseorang. ;)