2011-11-17 74 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

相关问题