我有进程ID,需要以编程方式关闭与Delphi5关联的进程

我有进程ID,需要以编程方式关闭与Delphi5关联的进程,delphi,Delphi,有人能帮我提供一个编码示例,在我有进程ID时关闭关联的进程。我将使用Delphi 5在Windows 2003服务器上以编程方式执行此操作。使用EnumWindows()和GetWindowProcessThreadId()查找属于该进程的所有窗口,然后向他们发送WM\u CLOSE和/或WM\u QUIT消息。连同WM\u CLOSE和WM\u QUIT,您可以让它变得非常优雅,只需启动第二个应用程序实例,并将STOP作为参数。像这样: 在项目主体中 if ((ParamCount >=

有人能帮我提供一个编码示例,在我有进程ID时关闭关联的进程。我将使用Delphi 5在Windows 2003服务器上以编程方式执行此操作。

使用
EnumWindows()
GetWindowProcessThreadId()
查找属于该进程的所有窗口,然后向他们发送
WM\u CLOSE
和/或
WM\u QUIT
消息。

连同WM\u CLOSE和WM\u QUIT,您可以让它变得非常优雅,只需启动第二个应用程序实例,并将STOP作为参数。像这样:

在项目主体中

if ((ParamCount >= 1) and (UpperCase(paramstr(1)) = 'STOP')) then
  // send the WM_CLOSE, etc..

当应用程序启动并看到它有一个参数“STOP”时,然后搜索第一个实例并杀死它。然后在不创建主窗体的情况下退出第二个实例,等等。。通过这种方式,您不必编写/部署第二个程序来杀死第一个程序。

如果您有一个进程id并希望强制该进程终止,您可以使用以下代码:

function TerminateProcessByID(ProcessID: Cardinal): Boolean;
var
  hProcess : THandle;
begin
  Result := False;
  hProcess := OpenProcess(PROCESS_TERMINATE,False,ProcessID);
  if hProcess > 0 then
  try
    Result := Win32Check(Windows.TerminateProcess(hProcess,0));
  finally
    CloseHandle(hProcess);
  end;
end;

如果要在不终止进程的情况下正确关闭程序:

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><代码>。当您试图在不终止程序进程的情况下正确关闭程序时,您遵循程序例程,程序可能会对关闭消息做出不同的响应;例如,某些程序在关闭后将最小化到托盘中,等等。

如果应用程序不想关闭,可以通过调用OpenProcess和TerminateProcess强制关闭,这是一种不友好、困难的方式。假设相关应用程序支持此类命令行参数。大多数情况下都没有。@Remy-是的,这假设您可以更改程序以接受STOP参数,而不必编写第二个程序来关闭第一个程序。对于那些想知道的人:
Winapi.Windows
System.SysUtils
应该添加到此代码的uses子句中。