【问题标题】:close .exe file using wpf application and button click使用 wpf 应用程序关闭 .exe 文件并单击按钮
【发布时间】:2013-12-09 09:22:25
【问题描述】:

我想使用 WPF 以编程方式关闭在我的 PC 上运行的可执行文件 (.EXE),我已成功通过以下方式启动此 .EXE 文件:

if (_MyPath != "")
{
   Process StartApp = new Process();
   string str = @_MyPath;
   StartApp.StartInfo.FileName = str;
   StartApp.Start();
}
else
{
   MessageBox.Show("Path Empty", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}

现在我的目的是通过单击按钮来关闭此 .EXE 文件的进程?

【问题讨论】:

  • 你需要找到有问题的进程,一旦找到 - 你就杀了。 msdn.microsoft.com/en-us/library/…
  • @Ahmedilyas OP 已经引用了进程对象
  • 是的,我重读了它,之前错过了它。对不起!

标签: c# process system.diagnostics kill-process


【解决方案1】:

将流程实例存储在一个字段中并在其上调用Process.CloseMainWindowProcess.Kill

CloseMainWindow 向应用程序发送一个窗口关闭消息,让它询问用户,在关闭之前执行任何所需的操作,甚至决定忽略该请求。

Kill 另一方面,要求操作系统立即杀死目标进程,可能会导致数据丢失。这也是一个异步调用,也就是说你必须调用Process.WaitForExit来等待进程结束。

在这两种情况下,如果目标进程在您调用 Kill 或 CloseMainWindow 之前终止、正在终止过程中或操作系统根本无法终止它(可能是由于到安全限制)

为避免某些异常,您可以在尝试终止子应用程序之前简单地检查子应用程序是否已完成,方法是调用Process.HasExited

你可以试试这样的:

Process  _childApp;

private void SpawnProcess()
{
...
    if (_MyPath != "")
    {
       _childApp= new Process();
       string str = @_MyPath;
       _childApp.StartInfo.FileName = str;
       _childApp.Start();
    }
    else
    {
       MessageBox.Show("Path Empty", "Error", MessageBoxButton.OK,
                                              MessageBoxImage.Error);
    }
...
}

private void StopProcess()
{
    if (_childApp.HasExited)
        return;
    try
    {
        _childApp.Kill();
        if (!_childApp.WaitForExit(5000))
        {
          MessageBox.Show("Closing the app takes too long","Warning",
                                              MessageBoxButton.OK,
                                              MessageBoxImage.Error);
        }
    }
    catch(Exception exc)
    {
          MessageBox.Show(exc.ToString(),"Failed to close app",
                                              MessageBoxButton.OK,
                                              MessageBoxImage.Error);
    }
}

【讨论】:

    【解决方案2】:

    首先,您可能需要使用 Process.GetProcesses 找到有问题的进程。

    http://msdn.microsoft.com/en-us/library/system.diagnostics.process.getprocesses(v=vs.110).aspx

    或者甚至可以通过名称获取进程:

    http://msdn.microsoft.com/en-us/library/system.diagnostics.process.getprocessesbyname(v=vs.110).aspx

    然后一旦找到,你就杀了。这是一些文档:

    http://msdn.microsoft.com/en-us/library/system.diagnostics.process.kill(v=vs.110).aspx

    【讨论】:

    • 已经有引用的进程就不用再去搜索了
    • 同意@PanagiotisKanavos - 我重新阅读并弄清楚了。但是我采取了更多的解决方案,如果他们还没有参考,那么这就是你要做的。
    【解决方案3】:

    保存进程的引用,当你想停止它时,调用 Kill 方法:

    StartApp.Kill();
    

    【讨论】:

    • 我不会使用 kill。
    猜你喜欢
    • 1970-01-01
    • 2016-03-23
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    相关资源
    最近更新 更多