繁体   English   中英

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

[英]close .exe file using wpf application and button click

我想关闭使用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文件的过程?

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

CloseMainWindow向应用程序发送一个窗口关闭消息,该消息使应用程序可以要求用户在关闭之前执行任何必需的操作,甚至决定忽略该请求。

杀死另一方面,询问操作系统immediatelly杀死目标过程中,可能导致数据丢失。 这也是一个异步调用,这意味着您必须调用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);
    }
}

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

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

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

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

然后一旦发现,你就杀死了。 这里是一些文档:

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

保存该过程的引用,并在要停止该过程时调用Kill方法:

StartApp.Kill();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM