Delphi实现获取进程列表及相关信息的实例

Delphi实现获取进程列表及相关信息的实例

前言:

闲着没事,看着任务管理器好玩,查资料先简单实现一下,代码中没有加入获取CPU占用率的代码,这个代码网上很多,只是不喜欢那种写法,这里就不写了。以后继续完善,对于System Process和System的信息还没法获得,那位兄弟知道可以提个醒。

 代码如下

unit Main; 

interface 

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs,TlHelp32, StdCtrls, ComCtrls,psAPI; 

type
 PTokenUser  =  ^TTokenUser;
 _TOKEN_USER  =  record
 User:  TSIDAndAttributes;
 end;
 TTokenUser  =  _TOKEN_USER; 

 TForm1 = class(TForm)
  btn_Get: TButton;
  Lv_Process: TListView;
  procedure btn_GetClick(Sender: TObject);
  procedure FormCreate(Sender: TObject);
 private
  { Private declarations }
  function GetMemUsedText(memsize:Cardinal):string;
  function GetProcessPriority(priority:Cardinal):string;
  function GetCupUsedPercent(hprocess:THandle):string;
  function GetProcessUser(hprocess:THandle):string;
 public
  { Public declarations }
 end; 

var
 Form1: TForm1; 

implementation 

{$R *.dfm} 

{
作用:提权到Debug,为了在Vista和Win7下读取系统信息,运行时需要以管理员身份运行
}
function PromoteProcessPrivilege(Processhandle:Thandle;Token_Name:pchar):boolean;
var
  Token:cardinal;
  TokenPri:_TOKEN_PRIVILEGES;
  Luid:int64;
  i:DWORD;
begin
  Result:=false;
  //打开令牌
  if OpenProcessToken(Processhandle,TOKEN_ADJUST_PRIVILEGES,Token) then
  begin
   //看系统权限的特权值
    if LookupPrivilegeValue(nil,Token_Name,Luid) then
    begin
      TokenPri.PrivilegeCount:=1;
      TokenPri.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
      TokenPri.Privileges[0].Luid:=Luid;
      i:=0;
      //提权
      if AdjustTokenPrivileges(Token,false,TokenPri,sizeof(TokenPri),nil,i) then
        Result:=true;
    end;
  end;
  CloseHandle(Token);
end; 

function AddFileTimes(KernelTime, UserTime: TFileTime): TDateTime;
var
 SysTimeK, SysTimeU: TSystemTime;
begin
 FileTimeToSystemTime(KernelTime, SysTimeK);
 FileTimeToSystemTime(UserTime, SysTimeU);
 Result :=SystemTimeToDateTime(SysTimeK)+SystemTimeToDateTime(SysTimeU);
end; 

//获取CPU时间
function GetProcCPUTime(procID:THandle): TDateTime;
var
 CreationTime, ExitTime, KernelTime, UserTime: TFileTime;
begin
 GetProcessTimes(procID, CreationTime, ExitTime, KernelTime,UserTime);
 Result := AddFileTimes(KernelTime, UserTime);
end; 

procedure TForm1.btn_GetClick(Sender: TObject);
var
 hSnapShot,hProcess,hModel:THandle;
 pEntry:TProcessEntry32;
 find:Boolean;
 item:TListItem;
 //内存信息
 pPMC:PPROCESS_MEMORY_COUNTERS;
 pPMCSize,ProcessPriority:Cardinal;
 n:DWORD;
 fName:array [0..MAX_PATH-1] of char;
begin
 //创建进程快照
 hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 pEntry.dwSize := SizeOf(pEntry);
 //第一个进程
 find := Process32First(hSnapShot,pEntry);
 while find do
 begin
  item := Lv_Process.Items.Add;
  //进程名
  item.Caption := pEntry.szExeFile;
  //进程ID
  item.SubItems.Add(IntToStr(pEntry.th32ProcessID));
  pPMCSize := SizeOf(PROCESS_MEMORY_COUNTERS);
  GetMem(pPMC,pPMCSize);
  pPMC.cb := pPMCSize;
  //打开进程,增加PROCESS_VM_READ权限,以便后面获取完整路径时使用
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,pEntry.th32ProcessID);
  //获取内存信息
  if GetProcessMemoryInfo(hProcess,pPMC,pPMCSize) then
  begin
   //取得进程的用户
   item.SubItems.Add(GetProcessUser(hProcess));
   //内存使用
   item.SubItems.Add(GetMemUsedText(pPMC.WorkingSetSize));
   //内存峰值
   item.SubItems.Add(GetMemUsedText(pPMC.PeakWorkingSetSize));
   //CPU时间
   item.SubItems.Add(FormatDateTime('hh:mm:ss',GetProcCPUTime(hProcess)));
   //获取优先级
   ProcessPriority := GetPriorityClass(hProcess);
   item.SubItems.Add(GetProcessPriority(ProcessPriority));
   //根据进程句柄找到模块句柄
   ENumProcessModules(hProcess,@hModel,SizeOf(hModel),n);
   //取得完整路径
   GetModuleFileNameEx(hProcess,hModel,fName,Length(fName));
   item.SubItems.Add(fName);
  end;
  FreeMem(pPMC);
  CloseHandle(hProcess);
  find := Process32Next(hSnapShot,pEntry);
 end;
end; 

function TForm1.GetCupUsedPercent(hprocess: THandle): string;
begin
end; 

function TForm1.GetMemUsedText(memsize: Cardinal): string;
begin
 Result := IntToStr(memsize div 1024) + ' K';
end; 

function TForm1.GetProcessPriority(priority: Cardinal): string;
begin
 case priority of
  IDLE_PRIORITY_CLASS: Result := '低';
  NORMAL_PRIORITY_CLASS: Result := '普通';
  HIGH_PRIORITY_CLASS: Result := '高';
  REALTIME_PRIORITY_CLASS: Result := '实时';
 end;
end; 

//获取进程的所属用户
function TForm1.GetProcessUser(hprocess: THandle): string;
var
 hToken:THandle;
 dwSize,dwUserSize,dwDomainSize:DWORD;
 pUser:PTokenUser;
 szUserName, szDomainName: array of Char;
 peUse:  SID_NAME_USE;
begin
 //打开权限
 if not OpenProcessToken(hprocess,TOKEN_QUERY,hToken) then Exit;
 //获取令牌信息,这里第三个参数使用了nil,是先返回实际大小dwSize,然后根据这个大小去分配内存
 GetTokenInformation(hToken,TokenUser,nil,0,dwSize);
 pUser := nil;
 //分配空间
 ReallocMem(pUser,dwSize);
 dwUserSize := 0;
 dwDomainSize := 0;
 //获取信息
 if not GetTokenInformation(hToken,TokenUser,pUser,dwSize,dwSize) then Exit;
 //查找用户信息,先返回用户名和域名的大小,当然你也可以一次性得到,即不使用动态数组
 LookupAccountSid(nil,pUser.User.Sid,nil,dwUserSize,nil,dwDomainSize,peUse);
 if (dwUserSize <> 0) and (dwDomainSize <> 0) then
 begin
  //分配长度
  SetLength(szUserName,dwUserSize);
  SetLength(szDomainName,dwDomainSize);
  //再次,获取用户名和域名
  LookupAccountSid(nil,pUser.User.Sid,PChar(szUserName),dwUserSize,PChar(szDomainName),dwDomainSize,peUse);
 end;
 Result := PChar(szUserName)+'/'+PChar(szDomainName);
 CloseHandle(hToken);
 FreeMem(pUser);
end; 

procedure TForm1.FormCreate(Sender: TObject);
begin
 PromoteProcessPrivilege(GetCurrentProcess,'SeDebugPrivilege');
end; 

end.

运行图片

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Delphi远程连接Mysql的实现方法

    本文实例讲述了Delphi远程连接Mysql的实现方法,是Delphi数据库程序设计中非常重要的技巧.分享给大家供大家参考之用.具体方法如下: Delphi 通过ADOConnection链接远程Mysql数据库,要在安装软件的电脑上安装Mysql 驱动,没有的在百度下载,搜索mysql ODBC驱动就出来了 主要的链接代码如下: var srstring:string; srstring:='DRIVER={MySQL ODBC 3.51 Driver};SERVER='+Trim(SERVE

  • Delphi实现窗体感知鼠标滑过并自动隐藏与显示窗口的方法

    本文实例讲述了Delphi实现窗体感知鼠标滑过并自动隐藏与显示窗口的方法.分享给大家供大家参考.具体实现方法如下: const WM_MouseEnter = $B013; WM_MouseLeave = $B014; type TfrmMain = class(TForm) . . Timer1: TTimer; procedure Timer1Timer(Sender: TObject); protected procedure WMMouseEnter(var Msg: TMessage)

  • delphi字符串分隔函数用法实例

    本文实例讲述了delphi字符串分隔函数用法.分享给大家供大家参考.具体实现方法如下: 该实例可实现根据字符串Separator的表示将字符串s分隔为若干个字符串,存入rs字符串列表中,具体代码如下: 复制代码 代码如下: procedure SeparateTerms2(s:string;Separator:string;var rs:TStringList); var   AStr: string;   idx: Integer;   ASubStr: string; begin   ASt

  • delphi实现保存和读取图片的方法

    本文实例讲述了delphi实现保存和读取图片的方法,是非常实用的技巧.分享给大家供大家参考.具体实现方法如下: 首先引用jpeg 1.显示图片: if OpenPictureDialog.Execute then begin img1.Picture.LoadFromFile(OpenPictureDialog.FileName); btnPicture.Text:=OpenPictureDialog.FileName; end; 2.保存图片: var Stream:TMemoryStream

  • Delphi基本图像处理方法汇总

    本文实例汇总了Delphi基本图像处理方法.分享给大家供大家参考.具体分析如下: //浮雕 procedure Emboss(SrcBmp,DestBmp:TBitmap;AzimuthChange:integer);overload; var i, j, Gray, Azimuthvalue, R, G, B: integer; SrcRGB, SrcRGB1, SrcRGB2, DestRGB: pRGBTriple; begin for i := 0 to SrcBmp.Height -

  • Delphi7中群发Email邮件的方法

    本文实例讲述了Delphi7中群发Email邮件的方法.分享给大家供大家参考.具体分析如下: 这段时间需要对所有参加考试的考生将考生信息及考试信息通过电子邮件群发,经过多次调试,算是成功了,发来给大家参考一下: 总的思路是: 1.安装局域网版的邮件服务器,并通过设置DNS使得给服务器能给网外用户发送电邮,这方面的软件比较多,例如WinWebMail就不错,可以从官网下载:   2.需要使用到的控件:Indy10.0.15,可以通过百度搜索下载:   3.设置需要发送的电子邮箱服务器及账号信息 复

  • delphi实现将BMP格式图形转化为JPG格式图形的方法

    本文实例讲述了delphi实现将BMP格式图形转化为JPG格式图形的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: procedure ConvertBMPtoJPG(SFileName,DFileName:string); Var   J:TJpegImage;   I:TBitmap;   S,D:String; begin   s:=SFileName;   d:=DFileName;   J:=TJpegImage.Create;   I:=TBitmap.Crea

  • Delphi实现获取进程列表及相关信息的实例

    Delphi实现获取进程列表及相关信息的实例 前言: 闲着没事,看着任务管理器好玩,查资料先简单实现一下,代码中没有加入获取CPU占用率的代码,这个代码网上很多,只是不喜欢那种写法,这里就不写了.以后继续完善,对于System Process和System的信息还没法获得,那位兄弟知道可以提个醒.  代码如下 unit Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,

  • C#获取进程或线程相关信息的方法

    本文实例讲述了C#获取进程或线程相关信息的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace ConsoleApp { class ProcessDo { /// <summary> /// 获取进程相关信息 /// </summary> pub

  • C#获取计算机硬件与操作系统的相关信息

    1.项目引用System.Management库文件 2.创建HardwareHandler.cs类文件 namespace HardInfoTest.Utility { /// <summary> /// 计算机硬件处理类 /// </summary> public class HardwareHandler { public enum WMIPath { // 硬件 Win32_Processor, // CPU 处理器 Win32_PhysicalMemory, // 物理内

  • JavaScript获取上传文件相关信息示例详解

    目录 前题场景 处理方式 图片文件 音频文件 判断处理 分析总结 前题场景 在开发过程中,文件上传是再熟悉不过的场景了,但是根据实际使用情况对上传文件的限制又各有不同.需要对本地上传文件进行相应的限制处理,防止不符合规则或者要求的文件上传到云存储中,从而造成云盘资源空间浪费. 与此同时,也在给客户端使用文件信息之前做了一次数据过滤处理,减少客户端对文件资源的处理和校验. 处理方式 因为客户端使用后台管理上传的图片文件和音频文件时,为了优化展示效果和加载的速度,所以在后台管理系统上传处希望依据图片

  • js 获取元素的具体样式信息getcss(实例讲解)

    如果想获取元素的某一个具体的样式属性值 1.元素.style.属性名 需要我们把元素的样式都写在行内样式上才可以(写在样式表中是不管用的) console.log(box.style.height)  ->null 在真实项目中,这种方式不常用,因为不能为了获取值而把所有的样式都写在行内(无法实现html和css的分离) 2.使用window.getComputedStyle(当前操作的元素对象,当前元素的伪类[一般我们不用伪类写null])这个方法获取所有经过浏览器计算过的样式 所有经过浏览器

  • PHP获取音频文件的相关信息

    项目需求:现在有一个音频文件上传的功能,在上传后PHP需要获取这个音频文件的相关信息,例如:时长等,由于这个文件是放在买的空间上的,没有像ffmpeg这样的扩展来处理,那么PHP能不能获取到这些信息? 下面是之前在项目中用到的一个用PHP进行音频文件头部信息的读取与写入操作的实现,主要针对 WMA 和 MP3 两种格式,供参考. <?php // AudioExif.class.php // 用PHP进行音频文件头部信息的读取与写入 // 目前只支持 WMA 和 MP3 两种格式, 只支持常用的

  • JAVA如何获取jvm和操作系统相关信息

    目录 什么是JVM 背景 Jvm 操作系统 什么是JVM JVM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. 主流虚拟机 背景 今日搬砖

  • Python获取excel内容及相关操作代码实例

    Python没有自带openyxl,需要安装: pip install openyxl 打开excel文档: openyxl.load_workbook(excel地址) - 打开现有excel文件 openyxl.Workbook() - 新建一个excel文件 返回一个工作博对象 import openpyxl wb = openpyxl.load_workbook("test.xlsx") print(type(wb)) # <class 'openpyxl.workboo

  • Android实现获取应用程序相关信息列表的方法

    本文所述为Androdi获取手机应用列表的方法,比如获取到Android应用的软件属性.大小和应用程序路径.应用名称等,获取所有已安装的Android应用列表,包括那些卸载了的,但没有清除数据的应用程序,同时在获取到应用信息的时候,判断是不是系统的应用程序,这是一个应用管理器所必需具备的功能. 具体实现代码如下: //AppInfoProvider.java package com.xh.ui; import java.util.ArrayList; import java.util.List;

  • 使用python 获取进程pid号的方法

    保存为.py文件后 运行脚本在后面添加进程名称即可 比如:python proinfo.py qq 即可获取QQ的进程信息,注意不区分大小写 复制代码 代码如下: #-*- encoding:UTF-8 -*-import osimport sysimport string import psutilimport re def get_pid(name): process_list = psutil.get_process_list() regex = "pid=(\d+),\sname=\'&

随机推荐