我希望使用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文件的进程?
答案 0 :(得分:3)
将流程实例存储在字段中,并在其上调用Process.CloseMainWindow或Process.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)
首先,您需要使用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
答案 2 :(得分:0)
保存过程的参考,当您想要停止它时,请调用Kill方法:
StartApp.Kill();