2009-12-18 55 views
0

我有一個c#win窗體程序,當我點擊一個按鈕後,它啓動一個windows應用程序,然後當我完成後,我想關閉應用程序並返回到我的勝利表單。當我關閉已啓動的應用程序時,我的勝利形式似乎總是被推到後面,我不得不尋找它。有任何想法嗎?從c#中的cmd.exe返回後使窗體活動?

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(); 

回答

1

嘗試在窗體上調用Activate()方法。請注意,根據操作系統的不同,這可能只是在任務欄中閃爍窗體。如果是這樣的話,你可能不得不借助一些互操作來將你的應用程序放在Windows堆棧的頂部。

0

我想我並沒有真正明白你想要做什麼,看着你的代碼。 您似乎一方面創建了一個空的進程(process1),然後再手動啓動另一個進程(通過直接調用靜態Process.Start方法)。 process1引用沒有做任何事情。

嘗試完全擦除碼引用過程1,守信只是部分創建CMDLINE和調用的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進程後繼續運行,它不會等待此過程完成。

1

使用process.WaitForExit()然後this.Focus() // or this.Select()

和另一觀察。而不是使用"a" + b + "c" + d使用string.Format("a{0}c{0}", b, d) - 這具有更好的性能,而且耗時更少。

+0

呃,string.Format是:請參閱http://blogs.msdn.com/ricom/archive/2004/03/12/88715.aspx。 (這是一個恥辱,我更喜歡它出於各種原因。) – 2009-12-18 17:08:50

+0

@Jeremy:對於時間消耗幾乎是一樣的事情,至於內存使用情況,string.Format更好。 – serhio 2009-12-18 18:25:10

+0

''a「+ b +」c「+ d'將被編譯器重寫爲'string.Concat(」a「,b,」c「,d)',這會導致一次分配。而且Rico在他的博客文章中表示,string.Format在內存消耗和速度方面都更差。 – Joey 2009-12-18 19:14:23