Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Прочитать список всех запущенных Exe / Проверить, запущен ли Exe?

01.01.2007
uses 
  Psapi, tlhelp32; 
 
procedure CreateWin9xProcessList(List: TstringList); 
var 
  hSnapShot: THandle; 
  ProcInfo: TProcessEntry32; 
begin 
  if List = nil then Exit; 
  hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
  if (hSnapShot <> THandle(-1)) then 
  begin 
    ProcInfo.dwSize := SizeOf(ProcInfo); 
    if (Process32First(hSnapshot, ProcInfo)) then 
    begin 
      List.Add(ProcInfo.szExeFile); 
      while (Process32Next(hSnapShot, ProcInfo)) do 
        List.Add(ProcInfo.szExeFile); 
    end; 
    CloseHandle(hSnapShot); 
  end; 
end; 
 
procedure CreateWinNTProcessList(List: TstringList); 
var 
  PIDArray: array [0..1023] of DWORD; 
  cb: DWORD; 
  I: Integer; 
  ProcCount: Integer; 
  hMod: HMODULE; 
  hProcess: THandle; 
  ModuleName: array [0..300] of Char; 
begin 
  if List = nil then Exit; 
  EnumProcesses(@PIDArray, SizeOf(PIDArray), cb); 
  ProcCount := cb div SizeOf(DWORD); 
  for I := 0 to ProcCount - 1 do 
  begin 
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or 
      PROCESS_VM_READ, 
      False, 
      PIDArray[I]); 
    if (hProcess <> 0) then 
    begin 
      EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb); 
      GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName)); 
      List.Add(ModuleName); 
      CloseHandle(hProcess); 
    end; 
  end; 
end; 
 
procedure GetProcessList(var List: TstringList); 
var 
  ovi: TOSVersionInfo; 
begin 
  if List = nil then Exit; 
  ovi.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); 
  GetVersionEx(ovi); 
  case ovi.dwPlatformId of 
    VER_PLATFORM_WIN32_WINDOWS: CreateWin9xProcessList(List); 
    VER_PLATFORM_WIN32_NT: CreateWinNTProcessList(List); 
  end 
end; 
 
function EXE_Running(FileName: string; bFullpath: Boolean): Boolean; 
var 
  i: Integer; 
  MyProcList: TstringList; 
begin 
  MyProcList := TStringList.Create; 
  try 
    GetProcessList(MyProcList); 
    Result := False; 
    if MyProcList = nil then Exit; 
    for i := 0 to MyProcList.Count - 1 do 
    begin 
      if not bFullpath then 
      begin 
        if CompareText(ExtractFileName(MyProcList.Strings[i]), FileName) = 0 then 
          Result := True 
      end 
      else if CompareText(MyProcList.strings[i], FileName) = 0 then Result := True; 
      if Result then Break; 
    end; 
  finally 
    MyProcList.Free; 
  end; 
end; 
 
 
// Example 1: Is a Exe-File running ? 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  if EXE_Running('Notepad.exe', False) then 
    ShowMessage('EXE is running') 
  else 
    ShowMessage('EXE is not running'); 
end; 
 
 
// Example 2: List running Exe-Files 
procedure TForm1.Button3Click(Sender: TObject); 
var 
  i: Integer; 
  MyProcList: TstringList; 
begin 
  MyProcList := TStringList.Create; 
  try 
    GetProcessList(MyProcList); 
    if MyProcList = nil then Exit; 
    for i := 0 to MyProcList.Count - 1 do 
      ListBox1.Items.Add(MyProcList.Strings[i]); 
  finally 
    MyProcList.Free; 
  end; 
end;

Взято с сайта https://www.swissdelphicenter.ch/en/tipsindex.php