如何避免进程从C#应用程序中窃取焦点?

Wil*_*ias 5 c# focus process

我在C#中按顺序启动多个进程时遇到一些问题.我试图开始的这些过程或多或少花了30秒来完成他的程序.而且我不希望这些流程从任何应用程序中窃取焦点.我尝试了两种方法(以下代码进入循环语句):

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();
Run Code Online (Sandbox Code Playgroud)

并使用Interaction.Shell和参数"AppWinStyle.MinimizedNoFocus":

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

这两种方法对我不起作用,因为过程(或开始和结束过程的动作)正在从任何应用程序中窃取焦点.我的应用程序运行时无法执行任何操作.

Joh*_*mer 2

改变:

myProcess.StartInfo.UseShellExecute = true;
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
Run Code Online (Sandbox Code Playgroud)

进入:

myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
Run Code Online (Sandbox Code Playgroud)

在您的示例中,您似乎不需要UseShellExecute,因为您直接运行可执行文件,因此在这种情况下不需要 shell。

但请注意,更改UseShellExecute为 false 确实会产生以下影响:

当 UseShellExecute 为 false 时,WorkingDirectory 属性不用于查找可执行文件。相反,它仅由启动的进程使用,并且仅在新进程的上下文中才有意义。当 UseShellExecute 为 false 时,FileName 属性必须是可执行文件的完全限定路径。

myProcess.WaitForExit();除非您确实想等待进程退出,否则不要使用。

WaitForExit() 重载用于使当前线程等待,直到关联的进程终止。此方法指示 Process 组件等待无限长的时间,以便进程和事件处理程序退出。这可能会导致应用程序停止响应。

另请参阅此内容以获取有关枚举和可能值的更多信息ProcessWindowStyle