2010-03-28 117 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