Tampilkan / Sembunyikan jendela konsol aplikasi konsol C #

192

Saya mencari informasi tentang cara menyembunyikan jendela konsol sendiri. Hebatnya, satu-satunya solusi yang bisa saya temukan adalah solusi hacky yang terlibat FindWindow()untuk menemukan jendela konsol dengan judulnya . Saya menggali sedikit lebih dalam ke dalam API Windows dan menemukan bahwa ada cara yang jauh lebih baik dan lebih mudah, jadi saya ingin mempostingnya di sini agar orang lain dapat menemukannya.

Bagaimana Anda menyembunyikan (dan menampilkan) jendela konsol yang terkait dengan aplikasi konsol C # saya sendiri?

Timwi
sumber

Jawaban:

268

Cukup buka Properti aplikasi dan ubah tipe Output dari Aplikasi Konsol ke Aplikasi Windows .

Fahad
sumber
9
Meskipun ini tidak menjawab pertanyaan OP, saya sangat menghargai Anda memberikan jawaban ini. Persis seperti yang saya butuhkan :)
kayleeFrye_onDeck
6
Ini bukan solusi, karena jendela cara ini tidak dapat ditampilkan.
Michał Woliński
6
Ini bukan solusi untuk apa yang diminta poster.
KansaiRobot
2
Meskipun hebat, solusi ini tidak memungkinkan Anda untuk mengontrol secara terprogram kapan harus menampilkan dan menyembunyikan konsol. Katakanlah Anda menerima param konsol yang ketika mengatur Anda ingin menyembunyikan konsol Anda (yaitu mode diam, verbose = false)
TheLegendaryCopyCoder
3
Ini bagus ketika Anda ingin memperbarui file yang dapat dieksekusi utama Anda di latar belakang dan kemudian menjalankannya. terima kasih
Ehsan
266

Begini caranya:

using System.Runtime.InteropServices;

[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();

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

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

var handle = GetConsoleWindow();

// Hide
ShowWindow(handle, SW_HIDE);

// Show
ShowWindow(handle, SW_SHOW);
Timwi
sumber
14
Jendela masih muncul sebentar di awal. Saya kira tidak ada jalan lain, kecuali jenis aplikasi diubah?
Ciaran Gallagher
2
Akan lebih baik jika ada jalan lain. Dengan begitu saya bisa menampilkan konsol ketika saya dalam mode debug, tetapi jalankan saja program saya dan keluar (tanpa jendela) ketika saya dalam mode run normal.
Vaccano
8
@ Vaccano: Dimungkinkan untuk membuat aplikasi Anda aplikasi konsol dalam mode Debug hanya dengan mengedit csprojfile secara manual. Visual Studio tidak memiliki GUI untuk melakukan ini, tetapi itu akan menghormati pengaturan jika Anda mengedit csprojfile dengan benar.
Timwi
3
Butuh:using System.Runtime.InteropServices;
Anthony Nichols
5
Ini adalah jawaban yang sangat bagus tapi saya mungkin menambahkan bahwa satu opsi lagi untuk ditambahkan adalah const int SW_SHOWMINIMIZED = 2;dan kemudian ShowWindow(handle, SW_SHOWMINIMIZED); Dengan cara ini konsol mulai tidak disembunyikan, hanya diminimalkan.
KansaiRobot
22

Mengapa Anda memerlukan aplikasi konsol jika Anda ingin menyembunyikan konsol itu sendiri? =)

Saya merekomendasikan pengaturan jenis Output Proyek ke Aplikasi Windows daripada aplikasi Konsol. Ini tidak akan menampilkan jendela konsol, tetapi jalankan semua tindakan, seperti aplikasi Konsol lakukan.

Sasha
sumber
28
Karena mungkin ada saatnya ketika saya benar-benar ingin menunjukkannya. Seperti, aplikasi konsol mencoba melakukan hal-hal dan tidak mengganggu siapa pun asalkan berhasil. Jika tidak, itu muncul dan menawarkan saya CLI.
Janis F
juga TopShelfmemungkinkan Anda untuk menjalankan Consolessebagai layanan dan ini istirahat bahwa
Mr Heelis
Jika Anda ingin standar keluar tersedia di konsol, maka Anda akan membutuhkan konsol, sesederhana itu.
Totte Karlsson
20

Anda dapat melakukan yang terbalik dan mengatur tipe output Aplikasi ke: Aplikasi Windows. Kemudian tambahkan kode ini ke awal aplikasi.

[DllImport("kernel32.dll", EntryPoint = "GetStdHandle", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr GetStdHandle(int nStdHandle);

[DllImport("kernel32.dll", EntryPoint = "AllocConsole", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int AllocConsole();

private const int STD_OUTPUT_HANDLE = -11;
private const int MY_CODE_PAGE = 437;
private static bool showConsole = true; //Or false if you don't want to see the console

static void Main(string[] args)
{
    if (showConsole)
    {
        AllocConsole();
        IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
        Microsoft.Win32.SafeHandles.SafeFileHandle safeFileHandle = new Microsoft.Win32.SafeHandles.SafeFileHandle(stdHandle, true);
        FileStream fileStream = new FileStream(safeFileHandle, FileAccess.Write);
        System.Text.Encoding encoding = System.Text.Encoding.GetEncoding(MY_CODE_PAGE);
        StreamWriter standardOutput = new StreamWriter(fileStream, encoding);
        standardOutput.AutoFlush = true;
        Console.SetOut(standardOutput);
    }

    //Your application code
}

Kode ini akan menampilkan Konsol jika showConsoleadatrue

Maiko Kingma
sumber
1
Itu memang memperlihatkan konsol dengan kursor yang berkedip, tetapi baik Console.WriteLine ("text") atau standardOutput.WriteLine ("text") tidak menunjukkan apa pun dalam kasus saya. Apakah ada yang hilang?
Ronny D'Hoore
9

Lihat posting saya di sini:

Tampilkan Konsol di Aplikasi Windows

Anda dapat membuat aplikasi Windows (dengan atau tanpa jendela) dan menampilkan konsol sesuai keinginan. Menggunakan metode ini jendela konsol tidak pernah muncul kecuali Anda secara eksplisit menunjukkannya. Saya menggunakannya untuk aplikasi mode ganda yang ingin saya jalankan dalam mode konsol atau gui tergantung pada bagaimana mereka dibuka.

Anthony
sumber
Luar biasa! cara termudah untuk menyembunyikan konsol adalah mengubah jenis proyek ke aplikasi Windows.
4

"Hanya untuk menyembunyikan" Anda dapat:

Ubah jenis output dari Aplikasi Konsol ke Aplikasi Windows ,

Dan alih-alih Console.Readline/keyAnda dapat menggunakan new ManualResetEvent(false).WaitOne()di akhir untuk menjaga aplikasi tetap berjalan.

NT
sumber
1

Jika Anda tidak ingin bergantung pada judul jendela gunakan ini:

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

...

    IntPtr h = Process.GetCurrentProcess().MainWindowHandle;
    ShowWindow(h, 0);
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new FormPrincipale());
lap
sumber
kita harus memberikan path lengkap file dll di DllImport ("fullPath") /
Tushar Gupta - curioustushar
0

Jika Anda tidak memiliki masalah dalam mengintegrasikan aplikasi batch kecil, ada program yang disebut Cmdow.exe yang memungkinkan Anda untuk menyembunyikan jendela konsol berdasarkan judul konsol.

Console.Title = "MyConsole";
System.Diagnostics.Process HideConsole = new System.Diagnostics.Process();
HideConsole.StartInfo.UseShellExecute = false;
HideConsole.StartInfo.Arguments = "MyConsole /hid";
HideConsole.StartInfo.FileName = "cmdow.exe";
HideConsole.Start();

Tambahkan exe ke solusi, atur action build ke "Content", atur Copy to Output Directory sesuai keinginan Anda, dan cmdow akan menyembunyikan jendela konsol saat dijalankan.

Untuk membuat konsol terlihat lagi, Anda cukup mengubah Argumen

HideConsole.StartInfo.Arguments = "MyConsole /Vis";
ScilsOff
sumber