2011-01-20 15 views
11

(SO yanıtlarını aradım ve bu soruna net bir çözüm bulunamadı.)Konsol penceresi Win32 GUI programından gösterilmeden alt konsol programları nasıl çalıştırılır?

Bir MFC GUI programı üzerinde çalışıyorum. Bu program, konsol programı ve kabuk komut dosyası (.cmd) dahil olmak üzere çeşitli alt programlar yürütür.

Başlangıçta bir GUI penceresi ve bir konsol penceresi (AllocConsole ile oluşturulan) görüntülendiğinden, alt işlemlerden birçok konsol çıktısı vardır. Ancak birçok kullanıcı konsol penceresinden şikayet etti, bu yüzden konsol penceresini gizlemeye karar verdik. ,

if (AllocConsole()) 
{ 
    ::ShowWindow(::GetConsoleWindow(), SW_HIDE); 
} 

Tamam hiçbir konsol penceresini ama konsol oluşturma anda görülebilir titreşim vardır:

Öncelikle aşağıda gibi çalıştı. Konsol penceresinin görüntülenmesini tamamen engellemek, ancak kısa zamanda başarısız olmak için çocuk süreçlerinin oluşturulması için birkaç CreateProcess seçeneği denedim ve pratik olarak imkansız olduğunu düşünüyorum.

Bu büyük bir anlaşma değildir. Başlangıçta geçici pencere titreşimini göz ardı edebiliriz.

Çocuk konsol penceresini tamamen gizlemek gerçekten imkansız mı?

+1

titreşim bekleniyor; bir konsol penceresi oluşturup gizliyorsunuz. Soru şu ki, kullanıcının onu görmesini istemiyorsanız, neden bir konsol penceresi yaratıyorsunuz? ShellExecute veya CreateProcess' ile ilgili sorun nedir? –

+2

@Code Gray Bu program CreateProcess çeşitli konsol programları. AllocConsole olmadan, ayrılmış ve kontrol edilemeyen konsol penceresi oluşturulacak, her zaman yok edilecektir. – 9dan

+0

Bunun ne anlama geldiğini bilmiyorum. Birkaç * farklı * konsol programı çalıştırıyorsunuz ve eğer 'CreateProcess' kullanıyorsanız, her seferinde eski olanı yeniden kullanmak yerine yeni bir konsol penceresi oluşturulacak mı? Evet ...? Bunun derdi ne? –

cevap

15

Kur CreateProcess çağrı için böyle STARTUPINFO:

STARTUPINFO si = { 0 }; 
    si.cb = sizeof(si); 
    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; 
    si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); 
    si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); 
    si.hStdError = GetStdHandle(STD_ERROR_HANDLE); 
    si.wShowWindow = SW_HIDE; 
+3

Teşekkürler! CREATE_NO_WINDOW seçeneği ile CreateProcess kullanıldığında mükemmel çalışır. – 9dan

+2

@Cody Gray: Sorun şu ki 'CreateProcess' kendi başına yetersiz, yanlış değil.G/Ç yönlendirmesi ve "CREATE_NO_WINDOW" bayrağı da gerekliydi. – MSalters

+1

'C#' 'ProcessStartInfo' işlevini kullanın ve' WindowStyle = ProcessWindowStyle.Hidden' öğesini ayarlayın. Hemen hemen aynı .NET Frameworked. – Bitterblue