Сделать форму активной после возврата из cmd.exe в С#?

У меня есть программа Win Forms С#, и после того, как я нажимаю кнопку, она запускает приложение Windows, а затем, когда я закончу, я хочу закрыть приложение и вернуться к моей форме выигрыша. Когда я закрываю запущенное приложение, кажется, что моя форма выигрыша всегда отодвигается полностью назад, и мне приходится искать ее. Любые идеи?

var process1 = new System.Diagnostics.Process();
process1.EnableRaisingEvents = false;

var leftPath = @"c:\codereview\" + curDateTime + @"\left\";
var rightPath = @"c:\codereview\" + curDateTime + @"\right\";
var execPath = @"c:\program files\winmerge\winmergeu.exe";
var strCmdLine = "/C " + '"' + execPath + '"' + " /r " + leftPath + " " + rightPath;
System.Diagnostics.Process.Start("CMD.exe", strCmdLine);
process1.Close();

person Mike Roosa    schedule 18.12.2009    source источник


Ответы (3)


Попробуйте вызвать метод Activate() на ваша форма. Обратите внимание, что в зависимости от ОС это может просто мигать формой на панели задач. Если это так, вам, возможно, придется прибегнуть к некоторому взаимодействию, чтобы вывести ваше приложение на вершину стека Windows.

person Franci Penov    schedule 18.12.2009

используйте process.WaitForExit(), затем this.Focus() // or this.Select()

И еще одно наблюдение. Вместо использования "a" + b + "c" + d используйте string.Format("a{0}c{0}", b, d) — это дает лучшую производительность и требует меньше времени.

person serhio    schedule 18.12.2009
comment
Э-э, string.Format ‹i›медленнее‹/i›: см. blogs.msdn.com/ricom/archive/2004/03/12/88715.aspx. (Это позор, я предпочитаю его по разным причинам.) - person Jeremy McGee; 18.12.2009
comment
@Jeremy: для потребления времени это почти то же самое, что и для использования памяти, string.Format лучше. - person serhio; 18.12.2009
comment
"a" + b + "c" + d будет переписано компилятором как string.Concat("a", b, "c", d), что приведет к единому распределению. И Рико сказал в своем блоге, что string.Format хуже как по потреблению памяти, так и по скорости. - person Joey; 18.12.2009

Я думаю, что не совсем понимаю, что вы пытаетесь сделать, глядя на ваш код. Кажется, вы создаете пустой процесс с одной стороны (process1), но затем запускаете другой вручную (путем прямого вызова статического метода Process.Start). Ссылка на процесс1 ничего не делает.

Попробуйте полностью стереть код, ссылающийся на process1, и оставить только часть, создающую командную строку и вызывающую Process.Start:

var leftPath = @"c:\codereview\" + curDateTime + @"\left\";
var rightPath = @"c:\codereview\" + curDateTime + @"\right\";
var execPath = @"c:\program files\winmerge\winmergeu.exe";
var strCmdLine = "/C " + '"' + execPath + '"' + " /r " + leftPath + " " + rightPath;
System.Diagnostics.Process.Start("CMD.exe", strCmdLine);

Также обратите внимание, что процесс запускается асинхронно. Ваш код будет продолжать выполняться сразу после создания процесса cmd, он не будет ждать завершения этого процесса.

person M-Peror    schedule 18.12.2009