2010-08-25 30 views
17

Soru: Görülmemesi gereken bir konsol programım var. (Bu IIS sıfırlar ve geçici dosyaları siler.)Konsol penceresini nasıl gizleyebilirim?

Şu anda böyle başlamak hemen sonra pencereyi gizlemek için yönetebilirsiniz:

static void Main(string[] args) 
{ 
    var currentProcess = System.Diagnostics.Process.GetCurrentProcess(); 
    Console.WriteLine(currentProcess.MainWindowTitle); 

    IntPtr hWnd = currentProcess.MainWindowHandle;//FindWindow(null, "Your console windows caption"); //put your console window caption here 
    if (hWnd != IntPtr.Zero) 
    { 
     //Hide the window 
     ShowWindow(hWnd, 0); // 0 = SW_HIDE 
    } 

sorunu bu saniyenin bir göz kırpması penceresini gösterir ise . Bir konsol programı için, gösterilmeden önce pencereyi gizleyebileceğim herhangi bir kurucu var mı?

İkincisi:

Ben

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

kullanıp İçinde 32 sevmiyorum. DllImport olmadan bunu yapmak için herhangi bir yolu var mı?
.NET yolu? (ör Console.WriteLine için) konsolu gerekmiyorsa

+0

Neden "user32.dll" adını beğenmiyorsunuz? –

+2

'user32.dll', özellikle 32 bit DLL değildir ve mimariye bakılmaksızın tüm Windows sürümlerinde kullanılabilir. İsim NT4'e giden bir mirastır. –

cevap

33

sonra uygulamaları Windows uygulaması olarak inşa seçenekleri değiştirin. Uygulama başladığında, Windows konsol oturumu tahsis etmez böylece

Bu .exe başlığında bir bayrak değiştirir. Sorunuzu anlamak

+1

Ya da Windows uygulaması oluşturun –

+3

farklı yaşam döngüsünü sahip olacak ve Windows form – abatishchev

+0

@Grand Crofton oluşturmayın rağmen, bir windows hizmeti yapmak: Hizmetler değil, kullanıcı tarafından tetiklenen için, uzun süren bir veya tekrarlanan arka plan görevlerini içindir IIS sıfırlama gibi işlemler. Yani burada bir hizmet uygun görünmüyor. IIS'yi her 5 dakikada bir sıfırlamak istemediğiniz sürece, elbette ;-) –

10

, sadece konsol penceresini elle konsol sürecini oluşturmak ve gizlemek:

Process process = new Process(); 
process.StartInfo.FileName = "Bogus.exe"; 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardOutput = true; 
process.StartInfo.CreateNoWindow = true; 

I (arka plan işçisi olarak) bir konsol uygulaması çalıştırır ve standart yönlendiren bir WPF uygulaması için bunu Çıktısı gerekirse sonucu bir pencerede görüntüleyebilirsiniz. bir tedavi böylece (vb işçi kodu, yönlendirmeyi, argüman geçmesini,) daha fazla kod görmek gerek varsa bana

+0

@Si: OP'nin “no-window konsol programı” nı çift tıklatarak başlatmak isteyebileceğini düşünüyorum, örneğin programlı olarak başka bir programdan değil. –

+0

Doğru, Daha önce de aynı ihtiyacı hissettim. Yakalayamadığım bir şey WPF'ye ANSI konsol çıkışı renklendirdi. Bkz. Http://stackoverflow.com/questions/1529254/capture-coloured-console-output-into-wpf-application – si618

3
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern bool CloseHandle(IntPtr handle); 

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern bool FreeConsole(); 

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, SetLastError = true)] 
private static extern IntPtr GetStdHandle([MarshalAs(UnmanagedType.I4)]int nStdHandle); 

// see the comment below 
private enum StdHandle 
{ 
    StdIn = -10, 
    StdOut = -11, 
    StdErr = -12 
}; 

void HideConsole() 
{ 
    var ptr = GetStdHandle((int)StdHandle.StdOut); 
    if (!CloseHandle(ptr)) 
     throw new Win32Exception(); 

    ptr = IntPtr.Zero; 

    if (!FreeConsole()) 
     throw new Win32Exception(); 
} 

daha konsol ilgili API here

+2

Not: Yeni PInvokeExcpetion() 'a atmak yerine normalde yeni Win32Exception() veya atmak Mareşal atmak .GetExceptionForHR (Marshal.GetHRForLastWin32Error()); yeterlidir. 'Win32Exception() ile' GetLastError' öğesini kendiniz çağırmaktan ve sonra da hata kodunu anlamlı bir mesajla eşleştirmek zorunda kalmazsınız. Her şey sizin için zaten yapıldı. –

+0

@ 0xA3: Bahşiş için teşekkürler! – abatishchev

+1

Örneğinizde GetStdHandle'ı gerçekten dahil etmeliydiniz (-11'i kullanmak yerine int'nin ne yaptığını netleştirmek için bir numara kullandım ..) ** özel numara StdHandle {Stdin = -10, Stdout = -11 Stderr = -12}; özel statik harici IntPtr GetStdHandle (StdHandle std); ** – Bostwick

2
[DllImport("user32.dll")] 
    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 
    [DllImport("kernel32")] 
    public static extern IntPtr GetConsoleWindow(); 
    [DllImport("Kernel32")] 
    private static extern bool SetConsoleCtrlHandler(EventHandler handler, bool add); 

    static void Main(string[] args) 
    { 
     IntPtr hConsole = GetConsoleWindow(); 
     if (IntPtr.Zero != hConsole) 
     { 
      ShowWindow(hConsole, 0); 
     } 
    } 

Bunun günümüze çağrıları Bkz bildirmek eserler ne istediğini yap.

İlgili konular