C#/ .NET:关闭主窗口外的另一个进程

时间:2010-03-28 07:32:42

标签: c# .net process

我只想问你关于如何“终止”正在运行的应用程序/流程的意见/建议是C#

现在,我确实有以下代码:

    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();但没有发生任何事情。

5 个答案:

答案 0 :(得分:3)

你应该看看

Process.HasExited Property

  

流程可以独立终止   你的代码如果你开始了   使用这个组件的过程,   系统更新HasExited的值   自动,即使相关联   流程独立退出。

答案 1 :(得分:3)

根据您的评论,当您点击关闭按钮时,Process实例已经退出。这可以在任何时候发生,这是你需要防范的事情。最简单的方法是简单地捕获在已经退出的进程上调用Kill所产生的异常。

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

答案 2 :(得分:3)

您正在启动使用ClickOnce安装的程序。 .appref-ms由辅助程序rundll32.exe执行,该程序启动进程并快速退出。要终止已启动的进程,您需要使用Process.GetProcessesByName()找到实际运行的.exe并使用Kill方法。

我们无法告诉您进程名称是什么,包含在.appref-ms文件中。但是使用TaskMgr.exe很容易看到。

答案 3 :(得分:3)

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

答案 4 :(得分:2)

首先请更换:

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

使用:

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

现在要点:我不知道Wosk.appref-ms是什么或者这个过程是如何开始的。如果这是一个文件,它将使用与此文件扩展名关联的默认程序打开。问题可能与您启动的进程仅启动另一个进程并立即终止有关。这就是为什么当你试图杀死它时它说它已经退出了,但它产生的实际过程仍在运行。在这种情况下,您必须使用Process.GetProcesses()枚举正在运行的进程,找到该进程并将其停止。