使用wpf应用程序和按钮单击关闭.exe文件

时间:2013-12-09 09:22:25

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

我希望使用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文件的进程?

3 个答案:

答案 0 :(得分:3)

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

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

另一方面,

杀死,要求操作系统立即终止目标进程,可能导致数据丢失。它也是一个异步调用,这意味着你必须调用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);
    }
}

答案 1 :(得分:0)

答案 2 :(得分:0)

保存过程的参考,当您想要停止它时,请调用Kill方法:

StartApp.Kill();