Konsol penceresini Process.Start C # 'dan gizle


103

System.Diagnostics.Process sınıfını kullanarak uzaktaki bir makinede işlem oluşturmaya çalışıyorum. Bir süreç yaratabiliyorum. Ancak sorun şu ki, bir servis oluşturmak uzun zaman alıyor ve konsol penceresi görüntüleniyor. Bir başka can sıkıcı şey de konsol penceresinin windows formumun üstünde görüntülenmesi ve bu form üzerinde başka hiçbir işlem yapamıyorum. Gibi tüm özellikleri ayarladım CreateNoWindow = true,

proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

ama yine de konsol penceresini gösterir. hatta çıkışı ve hataları akışı ayırmak için yeniden yönlendirdim ama şans yok.

Konsol penceresini gizlemenin başka bir yolu var mı? Lütfen bana yardım edin .

İşte kodumun sc komutunu yürütmek için kullandığım kısmı.

Process proc = new Process();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.StartInfo.FileName = "sc";
proc.StartInfo.Arguments = string.Format(@"\\SYS25 create MySvc binPath= C:\mysvc.exe");
proc.StartInfo.RedirectStandardError = false;
proc.StartInfo.RedirectStandardOutput = false;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;
proc.Start();
proc.WaitForExit();

Ayarlamayı denedin proc.StartInfo.RedirectedStandardOutput = truemi? Bunu bir Windows Uygulamasıyla çalışmak için aldım.
poy

tam kaynak kod örneği üzerinde çalışan herhangi bir nihai çözüm var mı?
Kiquenet

Bir Windows konsol uygulamasında, UseShellExecute'u (yönlendirme veya başka herhangi bir şey olmadan) ayarlamak benim için işe yaradı. Buraya bakın .
Paul

Konsol penceresi formu açıp kilitlediği sürece, işlemi bir Görev olarak veya yeni bir İş Parçacığı üzerinde çalıştırmalısınız
Ryan Dooley

Neden UseShellExecuteve CreateNoWindowiki kez ayarlıyorsun ?
Mike Lowery

Yanıtlar:


120

Konsol penceresini göstermeden bir işlemi başlatmaya çalışırken benzer bir sorun yaşadım. İstediğim davranışı sergileyen birini bulana kadar birkaç farklı özellik değeri kombinasyonuyla test ettim.

UseShellExecuteÖzelliğin neden false olarak ayarlanması gerektiğini açıklayan bir sayfa aşağıda verilmiştir .
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

Sayfadaki Açıklamalar bölümü altında:

UseShellExecute özelliği true ise veya UserName ve Password özellikleri null değilse, CreateNoWindow özellik değeri yok sayılır ve yeni bir pencere oluşturulur.

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = fullPath;
startInfo.Arguments = args;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;

Process processTemp = new Process();
processTemp.StartInfo = startInfo;
processTemp.EnableRaisingEvents = true;
try
{
    processTemp.Start();
}
catch (Exception e)
{
    throw;
}

2
Bazı ek ayrıntılar eklemek ister misiniz? Bunun nasıl çalıştığından ziyade neden işe yaradığı .
aqua

2
Bunun nedeni standart çıktının pencereyi var olmaya zorlaması mı?
Denise Skidmore

1
Görünüşe göre standart çıktıyı ayarlamadan yeniden yönlendiremezsinizstartInfo.UseShellExecute = false;
Denise Skidmore

1
Neden, bu diğer cevapta UseShellExecute = true kullandıklarını merak ediyorum? stackoverflow.com/questions/2317767/c-process-start-hide
Denise Skidmore

10
İnsanların neden tekrar yaptıkları bir istisna yakaladıklarını asla anlayamayacağım.
Blindy

54

Bu cevapta şanssızlık yaşadım, süreç (Wix light.exe) esasen öğle yemeğine çıkıyor ve akşam yemeği için zamanında eve gelmiyor. Ancak, aşağıdakiler benim için iyi çalıştı:

Process p = new Process();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
// etc, then start process

2
Benim için çalıştı - güzel ve basit!
J c

2
Bu gerçekten kabul edilen cevap olmalı. Tıkır tıkır çalışıyor.
Ebedi 21

2
CreateNoWindow = truebenim için işe yaramadı, bu işe yaradı :)
Stefan Monov

3
Yalnızca pencereli uygulamalar için çalışır, konsol uygulaması hala pencereyi gösterir
Geograph

18

Bu çalışmalı, deneyin;


Bir Sistem Referansı ekleyin.

using System.Diagnostics;

Ardından, komutunuzu gizli bir CMD Penceresinde çalıştırmak için bu kodu kullanın.

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.Arguments = "Enter your command here";
cmd.Start();

11

Bu, pencereyi göstermez:

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.CreateNoWindow = true;

...
cmd.Start();
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.