Как избежать процессов, чтобы украсть фокус из приложения C #? - PullRequest
5 голосов
/ 17 ноября 2011

У меня проблемы с последовательным запуском нескольких процессов в 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();

И использование Interaction.Shell с параметром "AppWinStyle.MinimizedNoFocus":

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

Этидва подхода мне не помогли, потому что процессы (или действие запуска и завершения процесса) крадут фокус у любого приложения.Я ничего не могу сделать, когда мое приложение работает.

1 Ответ

2 голосов
/ 17 ноября 2011

Изменение:

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

В

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

Кажется, вам не нужно UseShellExecute в вашем примере, так как вы запускаете исполняемый файл напрямую и, следовательно, в этом случае оболочка не нужна.

Обратите внимание, однако, что изменение UseShellExecute на false имеет следующие эффекты:

Если значение UseShellExecute равно false, свойство WorkingDirectory не имеет значения используется для поиска исполняемого файла. Вместо этого он используется только процессом который начинается и имеет значение только в контексте нового процесс. Когда UseShellExecute имеет значение false, свойство FileName должно быть полный путь к исполняемому файлу.

И не используйте myProcess.WaitForExit();, если вы действительно не хотите ждать завершения процесса.

Перегрузка WaitForExit () используется для ожидания текущего потока. пока связанный процесс не завершится. Этот метод инструктирует Компонент процесса, чтобы ждать бесконечное количество времени для процесса и обработчики событий для выхода. Это может привести к остановке приложения отвечать на запросы.

Также см. this для получения дополнительной информации о перечислении ProcessWindowStyle и возможных значениях.

...