프로세스 목록 및 관련 정보를 얻는 델파이 구현의 예
머리말:
할 일이 없네요.. 작업 관리자를 보면 재미있습니다. 정보를 확인하고 간단하게 구현해 보았습니다. 코드에 CPU 사용량을 얻는 코드가 없습니다. 쓰는 방법이 있으므로 여기에는 쓰지 않겠습니다. 앞으로도 지속적으로 개선해 나가겠습니다만, 시스템 프로세스 및 시스템에 대한 정보는 아직 입수할 수 없습니다. 혹시 아시는 분 계시면 알려드리겠습니다.
코드는 다음과 같습니다
유닛 메인; 인터페이스는 Windows, 메시지, 컨트롤, 양식, TlHelp32, StdCtrls, ComCtrls,psAPI를 사용합니다. PTokenUser = ^TTokenUser = 기록 사용자: TTokenUser = _TOKEN_USER; TForm1= class(TForm) btn_Get: TButton: TListView; 프로시저 btn_GetClick(Sender: TObject); private { Private 선언 } function GetProcessPriority(priority:Cardinal) :문자열; GetCupUsedPercent(hprocess:THandle):string; function GetProcessUser(hprocess:THandle):string; public { 공개 선언 } end; var Form1: TForm1; 구현 {$R *.dfm} { 함수: Vista를 사용하여 Win7에서 시스템 정보를 읽으려면 관리자 권한으로 실행해야 합니다.} 기능 PromoteProcessPrivilege(Processhandle:Thandle;Token_Name:pchar):boolean; TokenPri:_TOKEN_PRIVILEGES; i:DWORD; start Result:=false; then 시작하다 //LookupPrivilegeValue(nil,Token_Name,Luid)가 TokenPri.PrivilegeCount:=1인 경우 시스템 권한의 권한 값을 확인합니다. TokenPri.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED[0].Luid:= Luid; i:=0; //권한 상승 adjustTokenPrivileges(Token,false,TokenPri,sizeof(TokenPri),nil,i) end; CloseHandle(Token) end; var SysTimeK, SysTimeU : TSystemTime; 시작 FileTimeToSystemTime(KernelTime, SysTimeK); FileTimeToSystemTime(UserTime, SysTimeU); Result :=SystemTimeToDateTime(SysTimeK)+SystemTimeToDateTime(SysTimeU); //CPU 시간 가져오기 function GetProcCPUTime(procID:THandle): TDateTime, ExitTime, KernelTime, UserTime: TFileTime; (procID, 생성 시간, 종료 시간, KernelTime,UserTime); Result := AddFileTimes(KernelTime, UserTime); 절차 TForm1.btn_GetClick(Sender: TObject); pEntry:TProcessEntry32; 메모리 정보 pPMC:PPROCESS_MEMORY_COUNTERS; pPMCSize,ProcessPriority:Cardinal; fName:array [0..MAX_PATH-1] of char; 시작 //프로세스 스냅샷 생성 hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0) := SizeOf(pEntry) ; //첫 번째 프로세스 find := Process32First(hSnapShot,pEntry); while find start item := Lv_Process.Items.Add; //프로세스 이름 item.Caption := pEntry.szExeFile; //프로세스 ID item.SubItems.Add(IntToStr(pEntry.th32ProcessID)) pPMCSize := SizeOf(PROCESS_MEMORY_COUNTERS ); GetMem(pPMC,pPMCize) := pPMCSize; //프로세스를 열고 나중에 hProcess를 사용하여 전체 경로를 얻을 수 있도록 PROCESS_VM_READ 권한을 늘립니다.= 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.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)); Add(fName) ; FreeMem(pPMC); find := Process32Next(hSnapShot,pEntry); end; function TForm1.GetCupUsedPercent(hprocess: THandle): string; start end; function TForm1.GetMemUsedText(memsize: Cardinal): start Result := IntToStr(memsize div 1024) K'; TForm1.GetProcessPriority(priority: Cardinal): 문자열; IDLE_PRIORITY_CLASS의 우선순위 시작: Result := 'low'; NORMAL_PRIORITY_CLASS: Result := 'normal'; REALTIME_PRIORITY_CLASS: Result:= 'real- 시간' ; 끝; //프로세스 사용자 가져오기 TForm1.GetProcessUser(hprocess: THandle): string; var hToken:THandle; dwSize,dwUserSize,dwDomainSize:DWORD; pUser:PTokenUserName: Char; //권한이 없으면 권한을 엽니다. OpenProcessToken(hprocess,TOKEN_QUERY,hToken) then Exit; //토큰 정보 가져오기, 여기서 세 번째 매개변수는 nil을 사용합니다. 이는 먼저 실제 크기 dwSize를 반환한 다음 이 크기에 따라 메모리를 할당합니다 GetTokenInformation(hToken,TokenUser,nil,0, dwSize); pUser := nil; //공간 할당 ReallocMem(pUser,dwUserSize); := 0; dwDomainSize := 0; //GetTokenInformation(hToken,TokenUser,pUser,dwSize,dwSize)이 아닌 경우 정보를 가져온 다음 종료합니다. //사용자 정보를 찾으려면 먼저 사용자 이름과 도메인 이름 크기를 반환합니다. 물론 동적 배열 LookupAccountSid(nil,pUser.User.Sid,nil,dwUserSize)를 사용하지 않고도 한 번에 모두 가져올 수도 있습니다. ,nil,dwDomainSize,peUse); if ( dwUserSize <> 0) 및 (dwDomainSize <> 0) 시작 //길이 할당 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); start PromoteProcessPrivilege(GetCurrentProcess,'SeDebugPrivilege');
그림을 실행
궁금한 점이 있으면 메시지를 남기거나 이 사이트의 커뮤니티에 가서 소통하고 토론하세요. 읽어주셔서 감사합니다. 이 사이트를 지원해 주셔서 감사합니다.