【问题标题】:Get list of all runing processes (with processName+ProcessPath+ProcessTitle) [closed]获取所有正在运行的进程的列表(带有进程名称+进程路径+进程标题)[关闭]
【发布时间】:2014-01-28 15:25:42
【问题描述】:

我想做什么:

获取所有正在运行的进程的列表:processName(没有.exeProcessFullFilePathProcessMainWindowTitle 类似:

process1 c:\p1.exe TheprocessTitle
..............



非常重要: 我需要不会产生任何异常的工作代码(try catch




我的代码:
我使用TLHelp32 获取名称列表:

var handler: THandle;
    data: TProcessEntry32;

  function GetName: string;
  var i:byte;
  begin
     Result := '';
     i := 0;
     while data.szExeFile[i] <> '' do
     begin
        Result := Result + data.szExeFile[i];
        Inc(i);
     end;
   end;
begin
    Application.ShowMainForm := False;
    handler := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  if Process32First(handler, data) then
  begin
   ShowMessage(GetName());
    while Process32Next(handler, data) do
       ShowMessage(GetName());
   end;



这不够, 我需要:名称路径标题

【问题讨论】:

  • 这个问题似乎离题了,因为它太窄了

标签: delphi process kernel user32


【解决方案1】:

这个功能不行:

function GetName: string;
var i:byte;
begin
  Result := '';
  i := 0;
  while data.szExeFile[i] <> '' do
  begin
    Result := Result + data.szExeFile[i];
    Inc(i);
  end;
end;

问题是data.szExeFile[i] &lt;&gt; '' 总是评估True。这是因为data.szExeFile[i]char 类型的单个字符,而'' 是永远不等于单个字符的空字符串。

其实你可以像这样实现GetName

function GetName: string;
begin
  Result := data.szExeFile;
end;

您还需要在调用Process32First 之前初始化data,如文档中所述。你需要写:

data.dwSize := SizeOf(data);

在您致电Process32First之前。

这是您的程序的调试版本:

{$APPTYPE CONSOLE}

uses
  Windows, TlHelp32;

var
  Snapshot: THandle;
  pe: TProcessEntry32;

begin
  Snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  try
    pe.dwSize := SizeOf(pe);
    if Process32First(Snapshot, pe) then
      while Process32Next(Snapshot, pe) do
        Writeln(pe.szExeFile);
  finally
    CloseHandle(Snapshot);
  end;
  Readln;
end.

请注意,这不会为您提供可执行文件的完整路径。要获得完整路径,您需要使用GetModuleFileNameEx。这又需要一个进程句柄,您可以通过调用OpenProcess 从进程ID 中获取该句柄。并且进程 ID 在TProcessEntry32 记录中找到。

至于主窗口标题,那就更棘手了。许多进程没有主窗口。更何况那些做的,你怎么知道哪个窗口是主窗口?一个进程可能有多个顶级窗口,只有应用程序本身知道哪个是概念上的主窗口。事实上,可能没有单一的主窗口。如果有两个顶级窗口,则应用程序可能没有偏好哪个是主窗口。

也就是说,您可以通过调用EnumWindows 来枚举所有顶级窗口。然后为每个顶级窗口调用GetWindowThreadProcessId。这使您可以找出创建每个顶级窗口的应用程序的进程 ID,并从那里您应该能够将您决定需要的任何信息拼接在一起。所以,你问题的那部分没有一个明确的答案。在你进步之前,你需要弄清楚你想要什么。

【讨论】:

  • 好的,你帮我修复现有代码,谢谢我修复它。但我更喜欢编写可以获取 exe 路径、名称和标题的新代码,我不想修复代码我正在寻找新的工作代码,然后我会阅读代码,我会学习从他那里。但现在我需要代码:)。顺便说一句:你之前帮我注入了 dll。
  • 您要我为您编写代码吗?无论如何,答案中的代码是您的起点。它正确地枚举了进程。我已经告诉过你如何做其他事情了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多