2011-03-21 572 views
67

我正在嘗試使用System.Diagnostics.Process類在遠程計算機上創建進程。 我能夠創建一個進程。但問題是,創建服務需要很長時間並顯示控制檯窗口。 另一個煩人的事情是控制檯窗口顯示在我的窗體上,我不能在窗體上做任何其他操作。 我設置了所有的屬性,如CreateNoWindow = true從Process.Start隱藏控制檯窗口C#

proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden 

但仍顯示在控制檯窗口。即使我已將輸出和錯誤重定向到單獨的流,但沒有運氣。

是否有任何其他方式來隱藏控制檯窗口?請幫助我。

這是我用來執行sc命令的代碼的一部分。

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

您是否嘗試過設置'proc.StartInfo.RedirectedStandardOutput = true'?我已經得到了這個與Windows應用程序一起工作。 – Andrew 2012-12-06 21:09:41

+0

任何最終解決方案與完整的源代碼示例工作? – Kiquenet 2013-07-10 08:51:12

+0

在Windows *控制檯*應用程序中,只需設置UseShellExecute - 無w/o重定向或其他任何內容即可。請參閱[這裏](https://stackoverflow.com/a/47781912/63209)。 – Paul 2017-12-12 21:49:56

回答

86

我試圖啓動一個進程,但不顯示控制檯窗口時,也有類似的問題。我測試了幾個不同的屬性值組合,直到我找到一個展現了我想要的行爲。

以下是詳細說明爲什麼UseShellExecute屬性必須設置爲false的頁面。
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

在說明部分頁:

如果UseShellExecute屬性爲true或用戶名和 Password屬性不爲空,則CreateNoWindow屬性 值被忽略,並創建一個新的窗口。

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; 
} 
+1

小心添加一些其他詳細信息? **爲什麼**這個作品而不是**如何**。 – aqua 2013-05-24 00:26:29

+1

是否因爲標準輸出迫使窗口存在? – 2013-05-31 14:14:52

+1

顯然你不能在不設置'startInfo的情況下重定向標準輸出。UseShellExecute = false;' – 2013-05-31 14:19:19

36

我運氣不好這個答案,與過程(維克斯light.exe)基本上是外出吃午飯,不回家吃晚飯時間。但是,以下對我來說效果很好:

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

爲我工作 - 好又簡單! – 2014-02-27 06:00:30

+2

這應該是被接受的答案。奇蹟般有效。 – Eternal21 2014-04-11 19:45:41

+4

不起作用,該過程仍顯示窗口。 – Omarrrio 2014-09-14 20:43:49

9

這應該有效,因爲它適用於我。所以嘗試;

添加系統參考。

using System.Diagnostics; 

然後使用此代碼在一個隱藏的CMD窗口中運行您的命令。

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