【问题标题】:How to kill a process by name?如何按名称杀死进程?
【发布时间】:2017-10-02 03:04:00
【问题描述】:

如何终止从给定进程名称开始的进程?

例如:如何杀死program.exe?

我尝试了以下代码,它返回从 PID 开始的进程名称,但它不适合我的需要(在我的情况下,我有进程名称并想终止它)

function GetPathFromPID(const PID: cardinal): string;
var
  hProcess: THandle;
  path: array[0..MAX_PATH - 1] of char;
begin
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID);
  if hProcess <> 0 then
    try
      if GetModuleFileNameEx(hProcess, 0, path, MAX_PATH) = 0 then
        RaiseLastOSError;
      result := path;
    finally
      CloseHandle(hProcess)
    end
  else
    RaiseLastOSError;
end;

【问题讨论】:

  • 请详细说明“不起作用”是什么意思?这绝不是一个有效的问题描述。它会给你一个错误吗?你会得到意想不到的结果吗?什么都没有发生吗?你调试了吗?还是您想从文件名中获取进程 ID?如果同一个可执行文件有多个进程怎么办?

标签: delphi kill-process


【解决方案1】:

工作所有窗口。使用 FindWindow 单元窗口

KillTask('c:\my.cmd');

KillTask('caption');

procedure TForm1.KillTask(ExeFileName: string);
var
  H: HWND;
begin //ExeFileName = caption or cmd path
   H := FindWindow(nil, LPCWSTR(ExeFileName));
   if H <> 0 then
    PostMessage(H, WM_CLOSE, 0, 0);
end;

【讨论】:

    【解决方案2】:

    您可以使用this 函数按名称杀死进程:

    uses
      TlHelp32;
    
    function KillTask(ExeFileName: string): Integer;
    const
      PROCESS_TERMINATE = $0001;
    var
      ContinueLoop: BOOL;
      FSnapshotHandle: THandle;
      FProcessEntry32: TProcessEntry32;
    begin
      Result := 0;
      FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
      FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
      ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
    
      while Integer(ContinueLoop) <> 0 do
      begin
        if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
          UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
          UpperCase(ExeFileName))) then
          Result := Integer(TerminateProcess(
                            OpenProcess(PROCESS_TERMINATE,
                                        BOOL(0),
                                        FProcessEntry32.th32ProcessID),
                                        0));
         ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
      end;
      CloseHandle(FSnapshotHandle);
    end;
    

    注意:

    • 可能有多个进程具有相同的名称
    • KillTask 函数返回被杀死进程的计数
    • 我发现该函数的page 表明它适用于 Windows 9x/ME/2000/XP。
    • 我已经在 Windows 7/10 上亲自测试过

    【讨论】:

      猜你喜欢
      • 2011-02-25
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多