Exemple d'implémentation Delphi d'obtention d'une liste de processus et d'informations associées
Avant-propos :
Je n'ai rien à faire et c'est amusant de regarder le gestionnaire de tâches. J'ai vérifié les informations et je les ai brièvement implémentées. Il n'y a pas de code pour obtenir l'utilisation du processeur dans le code. Il y a beaucoup de codes en ligne que je n'aime pas. cette façon d'écrire, donc je ne l'écrirai pas ici. Nous continuerons à l'améliorer à l'avenir, mais les informations sur le processus système et le système ne peuvent pas encore être obtenues. Si quelqu'un le sait, je peux vous rappeler.
Le code est le suivant
unité principale ; l'interface utilise Windows, les messages, les SysUtils, les variantes, les classes, les graphiques, les contrôles, les formulaires, les boîtes de dialogue, TlHelp32, StdCtrls, ComCtrls, psAPI ; tapez PTokenUser = _TOKEN_USER ; TForm1 = classe (TForm) btn_Get : TButton ; Lv_Process : TListView ; procédure btn_GetClick (Expéditeur : TObject) ; procédure FormCreate (Expéditeur : TObject) ; private { Déclarations privées } function GetMemUsedText (memsize : Cardinal) : string ; :fonction chaîne; GetCupUsedPercent(hprocess:THandle):string; function GetProcessUser(hprocess:THandle):string; public { Déclarations publiques } end; var Form1: TForm1; function : élever les privilèges pour déboguer, afin de utiliser Vista Pour lire les informations système sous Win7, vous devez l'exécuter en tant qu'administrateur} fonction PromoteProcessPrivilege(Processhandle:Thandle;Token_Name:pchar):boolean; var Token:cardinal; TokenPri:_TOKEN_PRIVILEGES; i:DWORD; start Result:=false; //Ouvrir le jeton si OpenProcessToken(Processhandle,TOKEN_ADJUST_PRIVILEGES,Token) commencer // Regardez la valeur des privilèges des autorisations système si LookupPrivilegeValue(nil,Token_Name,Luid) puis commencez TokenPri.PrivilegeCount:=1; TokenPri.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED; TokenPri.Privileges[0].Luid:= Luid; i:=0; //Élever les droits si AjusterTokenPrivileges(Token,false,TokenPri,sizeof(TokenPri),nil,i) then Result:=true end; CloseHandle(Token end); : TSystemTime; commencer FileTimeToSystemTime(KernelTime, SysTimeK); FileTimeToSystemTime(UserTime, SysTimeU); Résultat :=SystemTimeToDateTime(SysTimeK)+SystemTimeToDateTime(SysTimeU); //Obtenir la fonction de temps CPU GetProcCPUTime(procID:THandle): TDateTime, ExitTime, KernelTime, UserTime: TFileTime; (procID, CreationTime, ExitTime, KernelTime,UserTime);= AddFileTimes(KernelTime, UserTime); procédure TForm1.btn_GetClick(Sender: TObject; var hSnapShot,hModel:THandle; Informations sur la mémoire pPMC:PPROCESS_MEMORY_COUNTERS ; pPMCSize,ProcessPriority:Cardinal; n:DWORD; fName:array [0..MAX_PATH-1] of char; start //Créer un instantané de processus hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); ; //Le premier processus trouvé := Process32First(hSnapShot,pEntry); while find do start item := Lv_Process.Items.Add; //Nom du processus item.Caption := pEntry.szExeFile; //ID du processus item.SubItems.Add(IntToStr(pEntry.th32ProcessID)); ); GetMem(pPMC,pPMCSize); pPMC.cb := pPMCSize; //Ouvrez le processus et augmentez l'autorisation PROCESS_VM_READ afin que hProcess puisse être utilisé pour obtenir le chemin complet ultérieurement := OpenProcess(PROCESS_QUERY_INFORMATION ou PROCESS_VM_READ,False,pEntry.th32ProcessID //Obtenir les informations sur la mémoire si GetProcessMemoryInfo(hProcess,pPMC); ,pPMCSize) puis commencez //Obtenir l'utilisateur du processus item.SubItems.Add(GetProcessUser(hProcess)); //Utilisation de la mémoire item.SubItems.Add(GetMemUsedText(pPMC.WorkingSetSize)); //Pic de mémoire item.SubItems.Add(GetMemUsedText( pPMC. //Heure du processeur item.SubItems.Add(FormatDateTime('hh:mm:ss',GetProcCPUTime(hProcess))); //Obtenir la priorité ProcessPriority := GetPriorityClass(hProcess); item.SubItems.Add(GetProcessPriority(ProcessPriority) ) ; //Trouver le handle du module en fonction du handle du processus ENumProcessModules(hProcess,@hModel,SizeOf(hModel),n); //Obtenir le chemin complet GetModuleFileNameEx(hProcess,hModel,fName,Length(fName)); Ajouter(fName) ; end; FreeMem(pPMC); CloseHandle(hProcess); Process32Next(hSnapShot,pEntry); fin; fin; fonction TForm1.GetCupUsedPercent(hprocess: THandle): chaîne; début fin; fonction TForm1.GetMemUsedText(memsize: Cardinal): chaîne début Résultat := IntToStr(memsize div 1024) + ' K' ; fin ; TForm1.GetProcessPriority(priority: Cardinal) : chaîne ; début de la priorité de cas de IDLE_PRIORITY_CLASS : Résultat := 'low'; NORMAL_PRIORITY_CLASS : Résultat := HIGH_PRIORITY_CLASS : Résultat := 'high'; temps' ; fin ; fin ; //Récupère la fonction utilisateur du processus TForm1.GetProcessUser(hprocess: THandle): string; var hToken:THandle; //Ouvrir les autorisations sinon OpenProcessToken(hprocess,TOKEN_QUERY,hToken) then Exit; //Obtenir les informations sur le jeton, le troisième paramètre utilise ici nil, qui renvoie d'abord la taille réelle dwSize, puis alloue de la mémoire en fonction de cette taille GetTokenInformation(hToken,TokenUser,nil,0 , dwSize); pUser := nil; //Allouer de l'espace ReallocMem(pUser,dwSize); := 0; dwDomainSize := 0; //Obtenir des informations si ce n'est pas GetTokenInformation(hToken,TokenUser,pUser,dwSize,dwSize) puis quitter ; //Pour rechercher des informations sur l'utilisateur, renvoyez d'abord le nom d'utilisateur et la taille du nom de domaine. Bien sûr, vous pouvez également les obtenir en même temps, c'est-à-dire sans utiliser le tableau dynamique LookupAccountSid(nil,pUser.User.Sid,nil,dwUserSize. ,nil,dwDomainSize,peUse); if ( dwUserSize <> 0) et (dwDomainSize <> 0) alors commencez //Allouer la longueur SetLength(szUserName,dwUserSize); SetLength(szDomainName,dwDomainSize); //Encore une fois, obtenez le nom d'utilisateur et le nom de domaineLookupAccountSid(nil,pUser.User.Sid,PChar(szUserName),dwUserSize,PChar(szDomainName), dwDomainSize, peUse); Résultat := PChar(szUserName)+'/'+PChar(szDomainName); CloseHandle(hToken); fin de la procédure TForm1.FormCreate(Sender: TObject);
Exécuter l'image
Si vous avez des questions, n'hésitez pas à laisser un message ou à vous rendre dans la communauté de ce site pour communiquer et discuter. Merci d'avoir lu, j'espère que cela pourra aider tout le monde. Merci pour votre soutien à ce site !