码迷,mamicode.com
首页 > 系统相关 > 详细

获取进程列表及相关信息

时间:2015-11-28 01:01:09      阅读:374      评论:0      收藏:0      [点我收藏+]

标签:

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

 

 

代码如下

 

 

[delphi] view plaincopy
 
  1. unit Main;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  7.   Dialogs,TlHelp32, StdCtrls, ComCtrls,psAPI;  
  8.   
  9. type  
  10.   PTokenUser   =   ^TTokenUser;  
  11.   _TOKEN_USER   =   record  
  12.   User:   TSIDAndAttributes;  
  13.   end;  
  14.   TTokenUser   =   _TOKEN_USER;  
  15.   
  16.   
  17.   TForm1 = class(TForm)  
  18.     btn_Get: TButton;  
  19.     Lv_Process: TListView;  
  20.     procedure btn_GetClick(Sender: TObject);  
  21.     procedure FormCreate(Sender: TObject);  
  22.   private  
  23.     { Private declarations }  
  24.     function GetMemUsedText(memsize:Cardinal):string;  
  25.     function GetProcessPriority(priority:Cardinal):string;  
  26.     function GetCupUsedPercent(hprocess:THandle):string;  
  27.     function GetProcessUser(hprocess:THandle):string;  
  28.   public  
  29.     { Public declarations }  
  30.   end;  
  31.   
  32. var  
  33.   Form1: TForm1;  
  34.   
  35. implementation  
  36.   
  37. {$R *.dfm}  
  38.   
  39. { 
  40. 作用:提权到Debug,为了在Vista和Win7下读取系统信息,运行时需要以管理员身份运行 
  41. }  
  42. function PromoteProcessPrivilege(Processhandle:Thandle;Token_Name:pchar):boolean;  
  43. var  
  44.     Token:cardinal;  
  45.     TokenPri:_TOKEN_PRIVILEGES;  
  46.     Luid:int64;  
  47.     i:DWORD;  
  48. begin  
  49.     Result:=false;  
  50.     //打开令牌  
  51.     if OpenProcessToken(Processhandle,TOKEN_ADJUST_PRIVILEGES,Token) then  
  52.     begin  
  53.       //看系统权限的特权值  
  54.         if LookupPrivilegeValue(nil,Token_Name,Luid) then  
  55.         begin  
  56.             TokenPri.PrivilegeCount:=1;  
  57.             TokenPri.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;  
  58.             TokenPri.Privileges[0].Luid:=Luid;  
  59.             i:=0;  
  60.             //提权  
  61.             if AdjustTokenPrivileges(Token,false,TokenPri,sizeof(TokenPri),nil,i) then  
  62.                 Result:=true;  
  63.         end;  
  64.     end;  
  65.     CloseHandle(Token);  
  66. end;  
  67.   
  68. function AddFileTimes(KernelTime, UserTime: TFileTime): TDateTime;  
  69. var  
  70.   SysTimeK, SysTimeU: TSystemTime;  
  71. begin  
  72.   FileTimeToSystemTime(KernelTime, SysTimeK);  
  73.   FileTimeToSystemTime(UserTime, SysTimeU);  
  74.   Result :=SystemTimeToDateTime(SysTimeK)+SystemTimeToDateTime(SysTimeU);  
  75. end;  
  76.   
  77. //获取CPU时间  
  78. function GetProcCPUTime(procID:THandle): TDateTime;  
  79. var  
  80.   CreationTime, ExitTime, KernelTime, UserTime: TFileTime;  
  81. begin  
  82.   GetProcessTimes(procID, CreationTime, ExitTime, KernelTime,UserTime);  
  83.   Result := AddFileTimes(KernelTime, UserTime);  
  84. end;  
  85.   
  86. procedure TForm1.btn_GetClick(Sender: TObject);  
  87. var  
  88.   hSnapShot,hProcess,hModel:THandle;  
  89.   pEntry:TProcessEntry32;  
  90.   find:Boolean;  
  91.   item:TListItem;  
  92.   //内存信息  
  93.   pPMC:PPROCESS_MEMORY_COUNTERS;  
  94.   pPMCSize,ProcessPriority:Cardinal;  
  95.   n:DWORD;  
  96.   fName:array [0..MAX_PATH-1] of char;  
  97. begin  
  98.   //创建进程快照  
  99.   hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);  
  100.   pEntry.dwSize := SizeOf(pEntry);  
  101.   //第一个进程  
  102.   find := Process32First(hSnapShot,pEntry);  
  103.   while find do  
  104.   begin  
  105.     item := Lv_Process.Items.Add;  
  106.     //进程名  
  107.     item.Caption := pEntry.szExeFile;  
  108.     //进程ID  
  109.     item.SubItems.Add(IntToStr(pEntry.th32ProcessID));  
  110.     pPMCSize := SizeOf(PROCESS_MEMORY_COUNTERS);  
  111.     GetMem(pPMC,pPMCSize);  
  112.     pPMC.cb := pPMCSize;  
  113.     //打开进程,增加PROCESS_VM_READ权限,以便后面获取完整路径时使用  
  114.     hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,pEntry.th32ProcessID);  
  115.     //获取内存信息  
  116.     if GetProcessMemoryInfo(hProcess,pPMC,pPMCSize) then  
  117.     begin  
  118.       //取得进程的用户  
  119.       item.SubItems.Add(GetProcessUser(hProcess));  
  120.       //内存使用  
  121.       item.SubItems.Add(GetMemUsedText(pPMC.WorkingSetSize));  
  122.       //内存峰值  
  123.       item.SubItems.Add(GetMemUsedText(pPMC.PeakWorkingSetSize));  
  124.       //CPU时间  
  125.       item.SubItems.Add(FormatDateTime(‘hh:mm:ss‘,GetProcCPUTime(hProcess)));  
  126.       //获取优先级  
  127.       ProcessPriority := GetPriorityClass(hProcess);  
  128.       item.SubItems.Add(GetProcessPriority(ProcessPriority));  
  129.       //根据进程句柄找到模块句柄  
  130.       ENumProcessModules(hProcess,@hModel,SizeOf(hModel),n);  
  131.       //取得完整路径  
  132.       GetModuleFileNameEx(hProcess,hModel,fName,Length(fName));  
  133.       item.SubItems.Add(fName);  
  134.     end;  
  135.     FreeMem(pPMC);  
  136.     CloseHandle(hProcess);  
  137.     find := Process32Next(hSnapShot,pEntry);  
  138.   end;  
  139. end;  
  140.   
  141. function TForm1.GetCupUsedPercent(hprocess: THandle): string;  
  142. begin  
  143. end;  
  144.   
  145. function TForm1.GetMemUsedText(memsize: Cardinal): string;  
  146. begin  
  147.   Result := IntToStr(memsize div 1024) + ‘ K‘;  
  148. end;  
  149.   
  150. function TForm1.GetProcessPriority(priority: Cardinal): string;  
  151. begin  
  152.   case priority of  
  153.     IDLE_PRIORITY_CLASS: Result := ‘低‘;  
  154.     NORMAL_PRIORITY_CLASS: Result := ‘普通‘;  
  155.     HIGH_PRIORITY_CLASS: Result := ‘高‘;  
  156.     REALTIME_PRIORITY_CLASS: Result := ‘实时‘;  
  157.   end;  
  158. end;  
  159.   
  160. //获取进程的所属用户  
  161. function TForm1.GetProcessUser(hprocess: THandle): string;  
  162. var  
  163.   hToken:THandle;  
  164.   dwSize,dwUserSize,dwDomainSize:DWORD;  
  165.   pUser:PTokenUser;  
  166.   szUserName, szDomainName: array of Char;  
  167.   peUse:   SID_NAME_USE;  
  168. begin  
  169.   //打开权限  
  170.   if not OpenProcessToken(hprocess,TOKEN_QUERY,hToken) then Exit;  
  171.   //获取令牌信息,这里第三个参数使用了nil,是先返回实际大小dwSize,然后根据这个大小去分配内存  
  172.   GetTokenInformation(hToken,TokenUser,nil,0,dwSize);  
  173.   pUser := nil;  
  174.   //分配空间  
  175.   ReallocMem(pUser,dwSize);  
  176.   dwUserSize := 0;  
  177.   dwDomainSize := 0;  
  178.   //获取信息  
  179.   if not GetTokenInformation(hToken,TokenUser,pUser,dwSize,dwSize) then Exit;  
  180.   //查找用户信息,先返回用户名和域名的大小,当然你也可以一次性得到,即不使用动态数组  
  181.   LookupAccountSid(nil,pUser.User.Sid,nil,dwUserSize,nil,dwDomainSize,peUse);  
  182.   if (dwUserSize <> 0) and (dwDomainSize <> 0) then  
  183.   begin  
  184.     //分配长度  
  185.     SetLength(szUserName,dwUserSize);  
  186.     SetLength(szDomainName,dwDomainSize);  
  187.     //再次,获取用户名和域名  
  188.     LookupAccountSid(nil,pUser.User.Sid,PChar(szUserName),dwUserSize,PChar(szDomainName),dwDomainSize,peUse);  
  189.   end;  
  190.   Result := PChar(szUserName)+‘/‘+PChar(szDomainName);  
  191.   CloseHandle(hToken);  
  192.   FreeMem(pUser);  
  193. end;  
  194.   
  195. procedure TForm1.FormCreate(Sender: TObject);  
  196. begin  
  197.   PromoteProcessPrivilege(GetCurrentProcess,‘SeDebugPrivilege‘);  
  198. end;  
  199.   
  200. end.  

 

 

运行图片

技术分享

 

http://blog.csdn.net/bdmh/article/details/6169949

 

获取进程列表及相关信息

标签:

原文地址:http://www.cnblogs.com/findumars/p/5001991.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!