Bir C # konsol uygulamasının konsol penceresini Göster / Gizle


192

Kişinin kendi konsol penceresini nasıl gizleyeceğimi öğrenmek için etrafta dolaştım. Şaşırtıcı bir şekilde, bulabildiğim tek çözüm FindWindow(), konsol penceresini başlığına göre bulmak için hacky çözümlerdi . Windows API içine biraz daha derin kazdık ve çok daha iyi ve daha kolay bir yol olduğunu buldum, bu yüzden başkalarının bulmak için buraya göndermek istedim.

Kendi C # konsol uygulamamla ilişkili konsol penceresini nasıl gizlersiniz (ve gösterirsiniz)?

Yanıtlar:


268

Sadece uygulamanın gidin Özellikleri ve değişim Çıktı türü den Konsol Uygulaması için Windows Başvuru .


9
Bu OP'nin sorusuna cevap vermese de, bu cevabı verdiğiniz için gerçekten minnettarım. Tam olarak ne ihtiyacım vardı :)
kayleeFrye_onDeck

6
Bu çözüm değildir, çünkü bu şekilde pencere gösterilemez.
Michał Woliński

6
Bu posterin sorduğu bir çözüm değil.
KansaiRobot

2
Harika olsa da, bu çözüm konsolun ne zaman gösterileceğini ve gizleneceğini programlı olarak kontrol etmenize izin vermez. Diyelim ki bir konsol parametresini kabul ettiğinizde konsolunuzu gizlemek istediğinizi (yani sessiz mod, ayrıntılı = yanlış)
TheLegendaryCopyCoder

3
Bu, ana yürütülebilir dosyanızı arka planda güncellemek ve daha sonra çalıştırmak istediğinizde harikadır. teşekkürler
Ehsan

266

Bunu nasıl yapacağınız aşağıda açıklanmıştır:

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

14
Pencere hala başlangıçta anlık görünür. Uygulama türü değişmedikçe, bunun hiçbir yolu yoktur sanırım?
Ciaran Gallagher

2
Bu konuda bir yol olsaydı iyi olurdu. Bu şekilde, hata ayıklama modundayken konsolu gösterebilirim, ancak normal çalışma modundayken programımı çalıştırıp (penceresiz) çıkıyorum.
Vaccano

8
@Vaccano: Uygulamanızı Hata Ayıklama modunda bir konsol uygulaması yapmak yalnızca csprojdosyayı el ile düzenleyerek mümkündür . Visual Studio'nun bunu yapmak için GUI'si yoktur, ancak csprojdosyayı doğru bir şekilde düzenlerseniz ayarı kabul eder .
Timwi

3
İhtiyaç:using System.Runtime.InteropServices;
Anthony Nichols

5
Bu çok güzel bir cevap ama eklemek için bir seçenek daha ekleyebiliriz const int SW_SHOWMINIMIZED = 2;ve sonra ShowWindow(handle, SW_SHOWMINIMIZED); Konsol gizlenmez başlar, sadece küçültülmüş.
KansaiRobot

22

Konsolun kendisini gizlemek istiyorsanız neden bir konsol uygulamasına ihtiyacınız var? =)

Proje Çıktı türünü Konsol uygulaması yerine Windows Uygulaması olarak ayarlamanızı öneririm . Konsol penceresini göstermez, ancak Konsol uygulaması gibi tüm eylemleri yürütür.


28
Çünkü gerçekten göstermek istediğim bir zaman gelebilir. Konsol uygulaması bir şeyler yapmaya çalışır ve başarılı olduğu sürece kimseyi rahatsız etmez. Değilse, açılır ve bana bir CLI sunar.
Janis F

Ayrıca bir hizmet olarak TopShelfçalıştırmak için izin verir Consolesve bu tatili
Mr Heelis

Standart çıkışın bir konsolda kullanılabilir olmasını istiyorsanız, o kadar basit bir konsola ihtiyacınız olacaktır.
Totte Karlsson

20

Tersine döndürebilir ve Uygulama çıktı türünü şu şekilde ayarlayabilirsiniz: Windows Uygulaması. Sonra bu kodu uygulamanın başına ekleyin.

[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
}

Bu kod Konsolu gösterecektir showConsoleolduğunutrue


1
Konsolu yanıp sönen bir imleçle gösterir, ancak ne Console.WriteLine ("text") ne de standardOutput.WriteLine ("text") benim durumumda hiçbir şey göstermez. Bir şey eksik mi?
Ronny D'Hoore

9

Yazımı burada görün:

Windows Uygulamasında Konsolu Göster

Bir Windows uygulaması (pencereli veya penceresiz) yapabilir ve konsolu istediğiniz gibi gösterebilirsiniz. Bu yöntemi kullanarak, açıkça göstermediğiniz sürece konsol penceresi asla görünmez. Nasıl açıldıklarına bağlı olarak konsol veya gui modunda çalıştırmak istediğim çift modlu uygulamalar için kullanıyorum.


Mükemmel! konsolu gizlemenin en kolay yolu proje türünü Windows uygulamasına değiştirmektir.

4

"Sadece gizlemek için":

Çıktısı türünü değiştirme Konsol Uygulaması için Windows Başvuru ,

Ve yerine Console.Readline/keykullanabileceğiniz new ManualResetEvent(false).WaitOne()uygulama çalışır durumda tutmak için sonunda.


1

Pencere başlığına bağlı olmak istemiyorsanız bunu kullanın:

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

DllImport ("fullPath") içinde dll dosyasının tam yolunu vermek zorundayız /
Tushar Gupta - curioustushar 28:13

0

Küçük bir toplu iş uygulamasını entegre etmekte sorun yaşamıyorsanız , konsol başlığını temel alarak konsol pencerelerini gizlemenizi sağlayacak Cmdow.exe adlı bir program vardır .

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

Exe'yi çözüme ekleyin, derleme işlemini "İçerik" olarak ayarlayın, Çıktı Dizinine Kopyala'yı size uygun olarak ayarlayın ve cmdow çalıştırıldığında konsol penceresini gizleyecektir.

Konsolu tekrar görünür yapmak için Bağımsız Değişkenleri değiştirmeniz yeterlidir.

HideConsole.StartInfo.Arguments = "MyConsole /Vis";
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.