Delphi 按进程名(即notepad.exe)正确关闭外部程序

Delphi 按进程名(即notepad.exe)正确关闭外部程序,delphi,Delphi,我正在开发一个演示软件 我的应用程序循环播放列表中的项目,获取要显示的项目(=文件名)的关联程序,然后使用“ShellExecute”功能启动关联程序。 到目前为止还不错 但在特定时间之后,执行的关联程序需要正确关闭(而不是终止/终止)。 我能够获取进程名(即notepad.exe)和PID 但是我看不到使用Processname关闭程序的方法。 我已经找到了一种使用“TerminateProcess”终止程序/进程的方法,但这不是我想要的方法 所以我的问题是,是否有一种方法可以通过使用Proc

我正在开发一个演示软件

我的应用程序循环播放列表中的项目,获取要显示的项目(=文件名)的关联程序,然后使用“ShellExecute”功能启动关联程序。 到目前为止还不错

但在特定时间之后,执行的关联程序需要正确关闭(而不是终止/终止)。 我能够获取进程名(即notepad.exe)和PID

但是我看不到使用Processname关闭程序的方法。 我已经找到了一种使用“TerminateProcess”终止程序/进程的方法,但这不是我想要的方法

所以我的问题是,是否有一种方法可以通过使用ProcessName或ProcessID来正确地停止/关闭外部程序


提前谢谢

您应该使用结束消息并将其发送到程序,我成功地使用了此代码,请尝试一下:

procedure TmyFRM.btn_closeClick(Sender: TObject);
var
  h: HWND;
begin
  h := FindWindow('Notepad', nil);
  if h <> 0 then
    PostMessage(h, WM_QUIT, 0, 0);
end;
程序TmyFRM.btn\u关闭单击(发送方:TObject);
变量
h:HWND;
开始
h:=FindWindow(“记事本”,无);
如果h0那么
PostMessage(h,WM_-QUIT,0,0);
结束;

并考虑有时可以使用<代码> WMyCalue而不是<代码> WMYEXECU/<代码>,也可以绕过<代码> SeNeDebug < /代码>,而不是<代码> PaseMe><代码>。当您试图在不终止程序进程的情况下正确关闭程序时,您遵循程序例程,程序可能会对关闭消息做出不同的响应;例如,某些程序在关闭后将最小化到托盘中,等等。

如果应用程序在退出前需要确认,您会怎么做?请看流程。请看。这取决于程序,一般来说,这甚至是不可能的。例如,设想一个在单个进程中打开所有文档的程序。想一想那些没有提供标准关闭机制的进程,想一想那些使用中间应用程序启动的程序。例如,*.pas文件不是由bds.exe打开的,而是由bdsLauncher.exe打开的(最终将文件转发到bds.exe的实例)。在这种情况下,PID引用的进程可能在您想要关闭它之前就终止了,但文档仍然处于打开状态。@Peter:好的,所以WM_close可能不是这里的最佳选项。使用WM_QUIT会更好。通常,我的应用程序只会显示一些“静态”文件(Jpg、Pdf、Pptx、Avi),因此应用程序永远不必要求保存文件(因为文件永远不会更改)。FindWindow在我的情况下不起作用,因为我只有ProcessName和ProcessID。FindWindow需要WindowName(应用程序的标题),所以这里不适合我。