2010-03-28 122 views
2

我只想問如何「終止」正在運行的應用程序/處理您的意見/建議之外的另一個過程是C#C#/。NET:關閉主窗口

現在,我有以下代碼:

Process myProcess; 
    private void btnOpen_Click(object sender, RoutedEventArgs e) 
    { 
     DirectoryInfo di = new DirectoryInfo(System.Environment.GetFolderPath(Environment.SpecialFolder.Programs)); 
     myProcess = Process.Start(di + @"\Wosk\Wosk.appref-ms"); // opening a file coming for Startup Menu 
    } 

    private void btnClose_Click(object sender, RoutedEventArgs e) 
    { 
     myProcess.Kill(); // not working - Cannot process request because the process has exited 
    } 

我也試過myProcess.Close();但沒有發生。

回答

3

你應該看看

Process.HasExited Property

進程可以獨立 代碼的終止。如果使用此組件啓動 進程,則即使關聯的 進程獨立退出, 系統也會自動更新HasExited 的值。

+3

這是錯誤的方法,因爲在返回false之後立即可以退出該進程。所以檢查'if(!myProcess.HasExited){myProcess.Kill(); }'仍然可以拋出異常。只需調用'Kill'​​並處理產生的異常就好多了。 – JaredPar 2010-03-29 15:56:26

2

首先請更換:

di + @"\Wosk\Wosk.appref-ms" 

有:

Path.Combine(di.FullName, @"Wosk\Wosk.appref-ms") 

現在的一點是:我不知道什麼是Wosk.appref-ms或者在該加工是如何開始。如果這是一個文件,它將以與此文件擴展名關聯的默認程序打開。問題可能與您啓動的流程僅啓動另一個流程並立即終止有關。這就是爲什麼當你試圖殺死它時,它說它已經退出,但它產生的實際進程仍在運行。在這種情況下,您必須通過Process.GetProcesses()列舉正在運行的進程,找到進程並停止進程。

+0

我沒有得到你的Path.Combine,但我現在很好。 – abramlimpin 2010-04-01 14:39:34

3

根據您的評論,它看起來像Process實例已經退出,當你點擊關閉按鈕。這可能隨時發生,這是你需要防範的。最簡單的方法是簡單地捕獲在已經退出的進程上調用Kill所導致的異常。

try { 
    myProcess.Kill(); 
} catch (InvalidOperationException) { 
    // Process is already finished so nothing to do 
} 
3

您正在啓動使用ClickOnce安裝的程序。 .appref-ms由幫助程序rundll32.exe執行,該程序啓動該進程並快速退出。要終止已啓動的進程,您需要使用Process.GetProcessesByName()來查找實際運行的.exe文件,並使用Kill方法。

我們不能告訴你進程名是什麼,它包含在.appref-ms文件中。但是,使用TaskMgr.exe可以輕鬆查看。

3
Process[] islemler = Process.GetProcessesByName("osk"); 
foreach (Process islem in islemler) 
    islem.Kill(); 
+0

這工作關閉myProcess.Start(「osk.exe」); – gridtrak 2016-06-21 00:15:50