2011-11-17 118 views
4

我在C#中順序啓動多個進程時遇到了一些問題。我試着開始的這些過程只需花費30秒就可以完成他的程序。我不希望這些進程竊取任何應用程序的焦點。我已經試過兩種方法(以下代碼到一個循環語句):如何避免進程從C#應用程序竊取焦點?

myProcess.StartInfo.UseShellExecute = true; 
myProcess.StartInfo.FileName = "References\\InclinacaoHGrid.exe"; 
myProcess.StartInfo.CreateNoWindow = true; 

myProcess.StartInfo.Arguments = i.ToString() + " " + j.ToString() + " " + 
             valA + " " + valS + " " + valP + " " + pathNodes; 
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; 
myProcess.EnableRaisingEvents = true; 
myProcess.Exited += new EventHandler(myProcess_Exited); 
myProcess.OutputDataReceived += new DataReceivedEventHandler(myProcess_OutputDataReceived); 
myProcess.Start(); 
myProcess.WaitForExit(); 

而且使用Interaction.Shell與參數「AppWinStyle.MinimizedNoFocus」:

int pid = Interaction.Shell("References\\InclinacaoHGrid.exe " + i.ToString() + " " + j.ToString() + " " + 
             valA + " " + valS + " " + valP + " " + pathNodes, AppWinStyle.NormalNoFocus,true); 

這兩種方法沒」因爲流程(或流程的開始和結束的行爲)正在從任何應用程序中竊取焦點,所以對我很有幫助。當我的應用程序運行時,我無法做任何事情。

+0

[開始一個進程而沒有竊取焦點(C#)]的可能的重複(http://stackoverflow.com/questions/2121911/starting-a-process-without-stealing-focus-c) –

回答

2

變化:

myProcess.StartInfo.UseShellExecute = true; 
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; 

分爲:

myProcess.StartInfo.UseShellExecute = false; 
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 

你似乎並不需要UseShellExecute在你的榜樣,因爲你是直接,因此在運行一個可執行不需要在shell這個案例。

不過請注意,改變UseShellExecute假確實有以下作用:

當UseShellExecute是假的,WorkingDirectory屬性不用於查找可執行 。取而代之的是,它僅在啓動的進程 中使用,並且僅在新進程 的上下文中具有含義。當UseShellExecute爲false時,FileName屬性必須是 到可執行文件的完全限定路徑。

並且不要使用myProcess.WaitForExit();除非您真的想等待進程退出。

WaitForExit()重載用於使當前線程等待 ,直到關聯的進程終止。此方法指示 進程組件爲進程 和事件處理程序退出等待無限時間。這可能會導致應用程序停止響應 。

有關ProcessWindowStyle枚舉和可能值的更多信息,另請參閱this

相關問題