delphi中获得进程列表或想要的进程,枚举进程、遍历进程

  1. 一个常见的编程任务是枚举所有运行的"应用程序"。Windows 任务管理器就是一个很好的例子。它用两种方式列出"应用程序"。任务管理器的第一个选项卡列出桌面上的所有"应用程序窗口"。第二个选项卡列出系统中的所有"进程"。本文提供了如何执行这些任务的详细信息。
  2. 枚举顶层窗口如果将枚举进程与枚举桌面上的顶层窗口进行比较,那么枚举顶层窗口可能更容易一些。要枚举顶层窗口,请使用 EnumWindows() 函数。不要使用 GetWindow() 创建自己的窗口列表,因为它可能受 z 轴次序更改和丢失窗口的干扰。
  3. EnumWindows() 将指向某个回调函数的指针以及用户定义的 LPARAM 值作为其参数。它对桌面上的每个窗口(或顶层窗口)分别调用一次回调函数。然后,回调函数可以对此窗口句柄进行某种处理,如将其添加到一个列表中。此方法可以保证不受窗口 z 轴次序更改等项的干扰。在获取窗口句柄后,可以通过调用 GetWindowText() 来获取其标题。
  4. 枚举进程
  5. 在系统中创建进程列表比枚举窗口要稍微复杂一些。这主要是因为执行此操作的 API 函数因所使用的 Win32 操作系统而异。在 Windows 95、Windows 98、Windows Millennium Edition、Windows 2000 和 Windows XP 中,可以使用 ToolHelp32 API 库中的函数。但是,在 Windows NT 中,必须使用 PSAPI API 库中的函数(Platform SDK 中包含该库)。本文将讨论这两种技术,另外还提供一个称为 EnumProcs() 的示例包装函数,该函数可以在 Win32 操作系统中运行。
  6. 使用 ToolHelp32 库枚举进程
  7. 首先讨论 ToolHelp32 方法。KERNEL32.dll 中的 ToolHelp32 函数是标准的 API 函数。注意,在 Windows NT 4.0 中不提供这些 API。
  8. 可以使用 ToolHelp32 提供的各种函数,枚举系统中的进程和线程以及获取内存和模块信息。但是,在枚举进程时,仅需要使用以下三个函数:CreateToolhelp32Snapshot()、Process32First() 和 Process32Next()。
  9. 使用 ToolHelp32 函数的第一步是创建系统信息的"快照"。可以使用 CreateToolhelp32Snapshot() 函数完成这一步。此函数允许选择在快照中存储的信息类型。如果您需要进程信息,则一定要包括TH32CS_SNAPPROCESS 标志。CreateToolhelp32Snapshot() 函数返回一个句柄,在使用完该句柄后,必须将其传递到 CloseHandle()。
  10. 下一步,为了检索快照中的进程列表,可以调用一次 Process32First,然后重复调用多次 Process32Next。执行此操作,直到其中的一个函数返回 FALSE 为止。这将逐个获得快照进程列表中的进程。这两个函数都将"快照"句柄和指向 PROCESSENTRY32 结构的指针作为其参数。
  11. 在调用 Process32First或 Process32Next 后,PROCESSENTRY32 结构将包含系统中某个进程的有用信息。进程 ID 在该结构的 th32ProcessID 成员中。可以将它传递到 OpenProcess() 以获取该进程的句柄。该进程的可执行文件(进程名称)和路径存储在结构的 szExeFile 成员中。还可以在此结构中找到其他有用的信息。(szExeFile是指进程名称)。
  12. 备注:切记,在调用 Process32First() 之前,将 PROCESSENTRY32 结构的 dwSize 成员设置为 sizeof(PROCESSENTRY32)。***********************************************************************************************************************************
  13. 举例:
  14. procedure TForm1.Button1Click(Sender: TObject); //在程序中添加一个buttin1按钮和一个memo1显示框  
    var  
    jubing : hwnd;//句柄  
    fprocessentry32 : TProcessEntry32; //结构类型的变量  
    zhenjia : Boolean;   //返回一个布尔值(用来判断是否找到进程信息)  
    processid : dword; //储存找到的进程ID  
    mingcheng : string; //储存找到的进程名称 end;  
      
      
    begin  
    jubing := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);   //获得进程快照句柄  
       fprocessentry32.dwSize := sizeof(fprocessentry32); //给TProcessEntry32结构的第一个参数赋值(也可以理解为把这个结构的第一个参数初始化)  
        zhenjia := Process32First(jubing,fprocessentry32); //使用 Process32First函数取得第一个进程的信息  
        while zhenjia = true do //如果 Process32First函数执行成功也就是说找到进程列表里的第一个进程时开始循环  
    begin  
       zhenjia := Process32Next(jubing,FprocessEntry32); //取得第下一个进程信息  
        mingcheng := fprocessentry32.szExeFile; //取得一个进程的名称  
        if mingcheng = 'svchost.exe' then //如果进程名等于这个字符串  
        self.Memo1.lines.Add(mingcheng); //把找到的进程显示出来  
    end;