Пример реализации Delphi получения списка процессов и сопутствующей информации
Предисловие:
Мне делать нечего. Забавно посмотреть диспетчер задач. Я проверил информацию и вкратце внедрил код для получения информации о загрузке ЦП. В сети много кодов. способ написания, поэтому я не буду писать это здесь. Мы продолжим его улучшать в будущем, но информацию о Системном Процессе и Системе пока получить невозможно. Если кто-нибудь знает, могу напомнить.
Код выглядит следующим образом
модуль Main; интерфейс использует Windows, сообщения, SysUtils, варианты, классы, графику, элементы управления, формы, диалоги, TlHelp32, StdCtrls, ComCtrls, psAPI; тип PTokenUser = ^TTokenUser; _TOKEN_USER = запись пользователя: TSIDAndAttributes; конец; ТФорм1= класс (TForm) btn_Get: TButton; Lv_Process: TListView; процедура btn_GetClick (Sender: TObject); частная {Частные объявления} функция GetMemUsedText (memsize: Cardinal): строка; функция GetProcessPriority (приоритет: Cardinal) :строка; функция GetCupUsedPercent(hprocess:THandle):string; function GetProcessUser(hprocess:THandle):string; public {Общественные объявления } end; var Form1: TForm1; используйте Vista. Чтобы прочитать системную информацию под Win7, вам нужно запустить ее от имени администратора} функция PromoteProcessPrivilege(Processhandle:Thandle;Token_Name:pchar):boolean; var Token:cardinal; TokenPri:_TOKEN_PRIVILEGES; Luid:int64; i:DWORD; start Result:=false; //Открыть токен, если OpenProcessToken(Processhandle,TOKEN_ADJUST_PRIVILEGES,Token) начинать //Просмотрите значение привилегии системных разрешений, если LookupPrivilegeValue(nil,Token_Name,Luid) then start TokenPri.PrivilegeCount:=1; TokenPri.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED; TokenPri.Privileges[0].Luid:= Luid; i:=0; //Повышаем права, если AdjustTokenPrivileges (Token, false, TokenPri, sizeof (TokenPri), nil, i) затем Результат: = true end; CloseHandle (Token); end; функция AddFileTimes (KernelTime, UserTime: TFileTime): var SysTimeK, SysTimeU; : TSystemTime; начать FileTimeToSystemTime (KernelTime, SysTimeK); FileTimeToSystemTime(UserTime, SysTimeU); Результат:=SystemTimeToDateTime(SysTimeK)+SystemTimeToDateTime(SysTimeU); //Получаем функцию времени процессора GetProcCPUTime(procID:THandle): var CreationTime, ExitTime, KernelTime, UserTime: TFileTime Begin GetProcessTimes; (procID, Время создания, Время выхода, KernelTime,UserTime); Результат: = AddFileTimes(KernelTime, UserTime); процедура TForm1.btn_GetClick(Sender: TObject); var hProcess,hModel:THandle; Информация о памяти pPMC:PPROCESS_MEMORY_COUNTERS; pPMCSize,ProcessPriority:Cardinal; n:DWORD; fName:array [0..MAX_PATH-1] of char; start //Создаем снимок процесса hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); pEntry.dwSize := SizeOf(pEntry) ; //Находит первый процесс := Process32First(hSnapShot,pEntry); while find do start item := Lv_Process.Items.Add; //Имя процесса item.Caption := pEntry.szExeFile; //Идентификатор процесса item.SubItems.Add(IntToStr(pEntry.th32ProcessID)); pPMCSize := SizeOf(PROCESS_MEMORY_COUNTERS) ); GetMem(pPMC,pPMCSize); pPMCSize; //Открываем процесс и увеличиваем разрешение PROCESS_VM_READ, чтобы hProcess можно было использовать для получения полного пути позже:= OpenProcess(PROCESS_QUERY_INFORMATION или PROCESS_VM_READ,False,pEntry.th32ProcessID //Получаем информацию о памяти, если GetProcessMemoryInfo(hProcess,pPMC); ,pPMCSize), затем начните //Получаем пользователя процесса item.SubItems.Add(GetProcessUser(hProcess)); //Использование памяти item.SubItems.Add(GetMemUsedText(pPMC.WorkingSetSize)); //Пиковый объем памяти item.SubItems.Add(GetMemUsedText( pPMC. // Время процессора 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)); Добавить (fName); конец; FreeMem (pPMC); CloseHandle (hProcess); Process32Next(hSnapShot,pEntry); конец; функция TForm1.GetCupUsedPercent(hprocess: THandle): строка; начало конца; функция TForm1.GetMemUsedText(memsize: Cardinal): строка; начало Результат: = IntToStr(memsize div 1024) + ' К'; конец; TForm1.GetProcessPriority(priority: Cardinal): строка; начальный приоритет IDLE_PRIORITY_CLASS: Результат: = 'низкий'; NORMAL_PRIORITY_CLASS: Результат: = 'нормальный'; HIGH_PRIORITY_CLASS: Результат: = 'высокий'; время'; конец; конец; //Получаем пользователя функции процесса TForm1.GetProcessUser(hprocess: THandle): string; var hToken:THandle; dwSize,dwUserSize,dwDomainSize:DWORD; pUser:PTokenUser; szUserName, szDomainName: массив Char; //Открыть разрешения, если нет OpenProcessToken(hprocess,TOKEN_QUERY,hToken) then Exit; //Получаем информацию о токене, третий параметр здесь использует nil, который сначала возвращает фактический размер dwSize, а затем выделяет память в соответствии с этим размером GetTokenInformation(hToken,TokenUser,nil,0 , dwSize); pUser := nil; //Выделяем пространство ReallocMem(pUser,dwSize); := 0; dwDomainSize := 0; //Получаем информацию, если не GetTokenInformation(hToken,TokenUser,pUser,dwSize,dwSize) then Exit; //Чтобы найти информацию о пользователе, сначала верните имя пользователя и размер доменного имени. Конечно, можно получить и все сразу, то есть без использования динамического массива LookupAccountSid(nil,pUser.User.Sid,nil,dwUserSize). ,nil,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); FreeMem(pUser); end; процедура TForm1.FormCreate(Sender: TObject);
Запустить картинку
Если у вас есть какие-либо вопросы, оставьте сообщение или зайдите в сообщество этого сайта, чтобы пообщаться и обсудить. Надеюсь, это поможет всем. Спасибо за вашу поддержку этого сайта!