プロセス一覧と関連情報を取得する Delphi の実装例
序文:
タスクマネージャーを見るのは楽しいので、コード内にCPU使用率を取得するコードはありません。書き方なのでここには書きません。今後も改善していきますが、システムプロセスやシステムに関する情報はまだ入手できておりませんので、ご存知の方がいらっしゃいましたらお知らせ致します。
コードは次のとおりです
ユニット Main; インターフェイスは Windows、メッセージ、SysUtils、バリアント、クラス、グラフィックス、コントロール、フォーム、TlHelp32、StdCtrls、ComCtrls、psAPI を使用します。タイプ PTokenUser = ^TTokenUser = レコード ユーザー: TTokenUser = _TOKEN_USER; TForm1= class(TForm) btn_Get: TButton; Lv_Process: TListView; プロシージャ btn_GetClick(Sender: TObject); プライベート { プライベート宣言 } function GetMemusedText(memsize:Cardinal):string; :文字列; GetCupusedPercent(hprocess:THandle):string; function GetProcessUser(hprocess:THandle):string; public { パブリック宣言 } end; var Form1: TForm1; 関数: デバッグ権限を昇格します。 Vista を使用する Win7 でシステム情報を読み取るには、管理者として実行する必要があります。} 関数PromoteProcessPrivilege(Processhandle:Thandle;Token_Name:pchar):boolean; var TokenPri:_TOKEN_PRIVILEGES; Luid:DWORD; //OpenProcessToken(Processhandle,TOKEN_ADJUST_PRIVILEGES,Token)始める//システム権限の権限値を確認します if 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) then Result:=true; end; function AddFileTimes(KernelTime:TFileTime): var SysTimeK, SysTimeU : TSystemTime; 開始 FileTimeToSystemTime(KernelTime, SysTimeK); FileTimeToSystemTime(UserTime, SysTimeU); Result :=SystemTimeToDateTime(SysTimeK)+SystemTimeToDateTime(SysTimeU); //CPU 時間関数 GetProcCPUTime(procID:THandle): var CreationTime, ExitTime, KernelTime: TFileTime; (procID、作成時刻、終了時刻、 KernelTime,UserTime); 結果 := AddFileTimes(KernelTime, UserTime); プロシージャ TForm1.btn_GetClick(Sender:TObject); item:TListItem;メモリ情報 pPMC:PPROCESS_MEMORY_COUNTERS; pPMCSize,ProcessPriority:Cardinal; n:DWORD; fName:array [0..MAX_PATH-1] of char; begin // プロセス スナップショットを作成します hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); pEntry.dwSize := SizeOf(pEntry) ; //最初のプロセス find := Process32First(hSnapShot,pEntry); while find do begin item := Lv_Process.Items.Add; // プロセス名 item.Caption := pEntry.szExeFile // プロセス ID item.SubItems.Add(IntToStr(pEntry.th32ProcessID)); ); GetMem(pPMC,pPMCサイズ); pPMCSize; //プロセスを開き、後で完全なパスを取得するために hProcess を使用できるように、PROCESS_VM_READ 権限を増やします:= OpenProcess(PROCESS_QUERY_INFORMATION または PROCESS_VM_READ,False,pEntry.th32ProcessID) //メモリ情報を取得 if GetProcessMemoryInfo(hProcess,pPMC) ,pPMCSize) から開始します//プロセスのユーザーを取得します item.SubItems.Add(GetProcessUser(hProcess)); //メモリ使用量 item.SubItems.Add(GetMemusedText(pPMC.WorkingSetSize)) //メモリ ピーク item.SubItems.Add(GetMemusedText( pPMC.ピークワーキングセットサイズ)); //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));追加(fName); 終了ハンドル(hプロセス); Process32Next(hSnapShot,pEntry); 終了; 関数 TForm1.GetCupusedPercent(hprocess: THandle): 開始 終了; 関数 TForm1.GetMemusedText(memsize: Cardinal): 開始 結果 := IntToStr(memsize div 1024) K'; 関数を終了します。 TForm1.GetProcessPriority(priority: Cardinal): 文字列; IDLE_PRIORITY_CLASS の開始ケース優先度: 結果 := 'normal'; HIGH_PRIORITY_CLASS: 結果 := 'high';時間' ; 終了; // プロセス関数のユーザーを取得します TForm1.GetProcessUser(hprocess:THandle): string; dwSize,dwUserSize,dwDomainSize:DWORD; pUser:PTokenUser: peUse: SID_NAME_USE; / /そうでない場合はアクセス許可を開くOpenProcessToken(hprocess,TOKEN_QUERY,hToken) then Exit; //トークン情報を取得します。ここでの 3 番目のパラメーターは nil を使用し、最初に実際のサイズ dwSize を返し、次にこのサイズに従ってメモリを割り当てます GetTokenInformation(hToken,TokenUser,nil,0 , dwSize); pUser := nil; // スペースを割り当てます。 := 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); CloseHandle(hToken); プロシージャ TForm1.FormCreate(Sender: TObject); end;
走行写真
ご質問がございましたら、メッセージを残すか、このサイトのコミュニティにアクセスしてご連絡ください。お読みいただきありがとうございます。このサイトをご支援いただきありがとうございます。