delphi 获取系统进程列表和进程所在路径  
官方Delphi 学习QQ群: 682628230(三千人)
频道

delphi 获取系统进程列表和进程所在路径


unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls;





type
  TForm1 = class(TForm)
    Button1: TButton;
    ListView: TListView;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }

    // Enum Processes



  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  Types, ActiveX, ComObj, Registry, {$ifdef FPC} JwaPsApi {$else} PsAPI {$endif FPC}, Nb30;

// Enum Processes
function ProcessIDs: TIntegerDynArray;
var ProcessSize: DWORD;
begin
  SetLength(Result, 1024);
  repeat
    SetLength(Result, 2 * Length(Result));
    Win32Check(EnumProcesses(@Result[0], Length(Result) * SizeOf(DWORD), ProcessSize));
  until Integer(ProcessSize) < Length(Result) * SizeOf(DWORD);
  SetLength(Result, ProcessSize div SizeOf(DWORD));
end;

function ProcessName(ProcessID: Integer): string;
var
  Process: THandle;
  ProcessName: array [0..MAX_PATH] of Char;
begin
  Result := '';
  Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessID);
  if Process <> 0 then
  try
    if GetModuleBaseName(Process, 0, ProcessName, SizeOf(ProcessName)) <> 0 then
      Result := ProcessName;
  finally
    CloseHandle(Process);
  end;
end;

function ProcessFileName(ProcessID: Integer): string;
var
  Process: THandle;
  FileName: array [0..MAX_PATH] of Char;
begin
  Result := '';
  Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessID);
  if Process <> 0 then
  try
    if GetModuleFileNameEx(Process, 0, FileName, SizeOf(FileName)) <> 0 then
      Result := FileName;
  finally
    CloseHandle(Process);
  end;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
  Processes: TIntegerDynArray;
  I: Integer;
  Item: TListItem;
  ProcessName1: string;
begin
  ListView.Items.BeginUpdate;
  try
    Processes := ProcessIDs;
    for I := 0 to Length(Processes) - 1 do
    begin
      ProcessName1 := ProcessName(Processes[I]);
      if ProcessName1 <> '' then
      begin
        Item := ListView.Items.Add;
        Item.Caption := IntToStr(Processes[I]);
        Item.SubItems.Text := ProcessName1;
        Item.SubItems.Append(ProcessFileName(Processes[I]));
      end;
    end;
  finally
    ListView.Items.EndUpdate;
  end;

end;

end.


推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.06795597076416 seconds