ตัวอย่างการใช้งาน Delphi เพื่อรับรายการกระบวนการและข้อมูลที่เกี่ยวข้อง
คำนำ:
ฉันไม่มีอะไรทำ การดู Task Manager ก็สนุกดี ฉันตรวจสอบข้อมูลแล้วนำไปใช้ในช่วงสั้นๆ วิธีการเขียน ดังนั้นฉันจะไม่เขียนมันที่นี่ เราจะปรับปรุงต่อไปในอนาคต แต่ยังไม่ได้รับข้อมูลเกี่ยวกับกระบวนการของระบบและระบบ ถ้าใครรู้ ฉันสามารถเตือนคุณได้
รหัสมีดังนี้
หน่วยหลัก อินเทอร์เฟซใช้ Windows, ข้อความ, SysUtils, ตัวแปร, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม, กล่องโต้ตอบ, TlHelp32, StdCtrls, ComCtrls, psAPI; ประเภท PTokenUser = ^TTokenUser = บันทึกผู้ใช้: TSIDAndAttributes; TForm1= คลาส (TForm) btn_Get: TButton; Lv_Process: TListView; ขั้นตอน btn_GetClick (ผู้ส่ง: TObject); ขั้นตอน FormCreate (ผู้ส่ง: TObject); ส่วนตัว { ประกาศส่วนตัว } ฟังก์ชั่น GetMemUsedText (memsize: Cardinal): string; :string; ฟังก์ชัน GetCupUsedPercent(hprocess:THandle):string; function GetProcessUser(hprocess:THandle):string; public { ประกาศสาธารณะ } end; var Form1: TForm1; { ฟังก์ชั่น: ยกระดับสิทธิ์ในการดีบัก เพื่อที่จะ ใช้ Vista หากต้องการอ่านข้อมูลระบบภายใต้ Win7 คุณต้องเรียกใช้ในฐานะผู้ดูแลระบบ} PromoteProcessPrivilege(Processhandle;Token_Name:pchar):boolean; var Token:_TOKEN_PRIVILEGES; Luid:int64; เริ่มผลลัพธ์:=false; //เปิดโทเค็นถ้า OpenProcessToken(Processhandle,TOKEN_ADJUST_PRIVILEGES) แล้ว เริ่ม //ดูค่าสิทธิ์ของระบบถ้า LookupPrivilegeValue(nil,Token_Name,Luid) จากนั้นเริ่ม TokenPri.PrivilegeCount:=1; TokenPri.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED; Luid; i:=0; //ยกระดับสิทธิ์ถ้า AdjustTokenPrivileges(Token,false,TokenPri,sizeof(TokenPri),nil,i) จากนั้นผลลัพธ์:=true; end; CloseHandle(Token); end; : TSystemTime; เริ่ม FileTimeToSystemTime(KernelTime, SysTimeK); FileTimeToSystemTime (UserTime, SysTimeU); ผลลัพธ์ : = SystemTimeToDateTime (SysTimeK) + SystemTimeToDateTime (SysTimeU); // รับฟังก์ชันเวลา CPU GetProccessTimes (procID: THandle): var CreationTime, ExitTime, KernelTime, UserTime: TFileTime (procID, CreationTime, ExitTime, KernelTime, UserTime); = AddFileTimes (KernelTime, UserTime); สิ้นสุด; ขั้นตอน TForm1.btn_GetClick (ผู้ส่ง: TObject); ข้อมูลหน่วยความจำ pPMC:PPROCESS_MEMORY_COUNTERS; pPMCSize,ProcessPriority:Cardinal; n:DWORD; fName:array [0..MAX_PATH-1] ของ char; start //สร้างสแน็ปช็อตกระบวนการ hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); ; //กระบวนการแรกค้นหา := Process32First(hSnapShot,pEntry); ในขณะที่ค้นหารายการเริ่มต้น := Lv_Process.Items.Add; //ชื่อกระบวนการ item.Caption := pEntry.szExeFile; //Process ID item.SubItems.Add(IntToStr(pEntry.th32ProcessID)); ); GetMem(pPMC,pPMCSize); pPMCSize; //เปิดกระบวนการและเพิ่มสิทธิ์ PROCESS_VM_READ เพื่อให้ hProcess สามารถใช้รับเส้นทางที่สมบูรณ์ได้ในภายหลัง:= OpenProcess(PROCESS_QUERY_INFORMATION หรือ PROCESS_VM_READ,False,pEntry.th32ProcessID); //รับข้อมูลหน่วยความจำหาก GetProcessMemoryInfo(hProcess,pPMC ,pPMCSize) จากนั้นจึงเริ่มต้น // รับผู้ใช้ของรายการกระบวนการ SubItems.Add (GetProcessUser (hProcess)); // รายการการใช้งานหน่วยความจำ SubItems.Add (GetMemUsedText (pPMC.WorkingSetSize)); // หน่วยความจำสูงสุด item.SubItems.Add (GetMemUsedText ( pPMC.PeakWorkingSetSize)); //รายการเวลา CPU.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 เพิ่ม(fName) ; end; FreeMem(pPMC); CloseHandle(hProcess); Process32Next(hSnapShot,pEntry); end; function TForm1.GetCupUsedPercent(hprocess: THandle): สตริง เริ่มต้น สิ้นสุด; ฟังก์ชัน TForm1.GetMemUsedText(memsize: Cardinal): สตริง; K'; สิ้นสุด; TForm1.GetProcessPriority (ลำดับความสำคัญ: พระคาร์ดินัล): สตริง เริ่มต้นลำดับความสำคัญของ IDLE_PRIORITY_CLASS: ผลลัพธ์ := 'ต่ำ'; NORMAL_PRIORITY_CLASS: ผลลัพธ์ := 'ปกติ'; เวลา' ; สิ้นสุด; //รับผู้ใช้ของฟังก์ชันกระบวนการ TForm1.GetProcessUser(hprocess: THandle): string; var hToken:THandle; peUse: SID_NAME_USE //เปิดการอนุญาตถ้าไม่ใช่ OpenProcessToken(hprocess,TOKEN_QUERY,hToken) จากนั้นออก; //รับข้อมูลโทเค็น พารามิเตอร์ที่สามที่นี่ใช้ nil ซึ่งจะส่งกลับขนาดจริง dwSize ก่อน จากนั้นจึงจัดสรรหน่วยความจำตามขนาดนี้ GetTokenInformation(hToken,TokenUser,nil,0 , dwSize); pUser := ไม่มี; //จัดสรรพื้นที่ ReallocMem(pUser,dwSize := 0; dwDomainSize := 0; // รับข้อมูลหากไม่ใช่ GetTokenInformation (hToken, TokenUser, pUser, dwSize, dwSize) จากนั้นออก //หากต้องการค้นหาข้อมูลผู้ใช้ ขั้นแรกให้ส่งคืนชื่อผู้ใช้และขนาดชื่อโดเมน แน่นอนว่าคุณสามารถรับข้อมูลทั้งหมดได้ในคราวเดียว นั่นคือ โดยไม่ต้องใช้อาร์เรย์แบบไดนามิก LookupAccountSid(nil,pUser.User.Sid,nil,dwUserSize) ,ไม่มี,dwDomainSize,peUse); ถ้า ( dwUserSize <> 0) และ (dwDomainSize <> 0) จากนั้นเริ่มต้น // จัดสรรความยาว SetLength(szUserName,dwUserSize); SetLength(szDomainName,dwDomainSize); // อีกครั้ง รับชื่อผู้ใช้และชื่อโดเมนLookupAccountSid(nil,pUser.User.Sid,PChar(szUserName),dwUserSize,PChar(szDomainName) dwDomainSize, peUse); สิ้นสุด; PChar(szUserName)+'/'+PChar(szDomainName); CloseHandle(hToken) สิ้นสุด;
วิ่งภาพ
หากคุณมีคำถามใด ๆ โปรดฝากข้อความหรือไปที่ชุมชนของไซต์นี้เพื่อสื่อสารและหารือกัน ขอขอบคุณสำหรับการอ่าน ฉันหวังว่ามันจะช่วยทุกคนได้