掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
タスクマネージャのデータを取得したい (ID:31777)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
横から失礼します. >呼び出すだけで現在の(タスクマネージャーの表示と同期のように) タスクマネージャの情報を読み取るということでしょうか. ですと,タスクマネージャーが起動していないとできませんよね? もっとも,方法はわかりませんが. >NtQuerySystemInformation は >Windows Vista 上では動作しないみたいです。 動作します. 以下のコードは,NtQuerySystemInformationでプロセス名の一覧をListViewに 表示するものです. このコードで,AInfo.qUserTimeとすれば,そのプロセスのユーザ使用時間が 求まります.またカーネルの使用時間も求まります. 残念ながら,CPUの使用率の詳しい計算方法は知りませんが. システムで使用した時間に対する,対象プロセスのCPU使用時間の割合では ないかと思います. つまり,一定の時間内ののCPUの使用時間を取得する必要があります. ということは,NtQuerySystemInformationを2回実行することになります. そこで,前のプロセス,カーネル時間,ユーザ時間を保存しておいて,次 にNtQuerySystemInformationを実行した時の情報から算出することに なるでしょう. 結構面倒な気がします. igyさんがレスしているリンクが参考になります. 違いは,NtQuerySystemInformationの引数です.全体かプロセス単位かは. またこれもigyさんがレスしていますが,ネットで検索すると,そのもの ではありませんが,参考になるサンプルが結構あります. あとは,やるだけです. くどいようですが,CPU使用率の計算方法を知らないとできないですね(笑). WMIを使用する方法もあるようです. http://www.online-admin.com/twmiperformancemonitor.html のTWmiPerformanceMonitor componentがそうです(コンポーネントですね) では,がんばってください. ------------ サンプルコード --------------- 使用コントロールはTListViewのみ unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TForm1 = class(TForm) ListView1: TListView; procedure FormShow(Sender: TObject); private ABuffer: array[0..65536] of Byte; procedure ListProcessName; public end; //SYSTEM_PROCESS_INFORMATIONレコード型の定義 //Delphiでは定義がないので定数なども定義する必要あり //[MicrosoftのOnlien資料] //http://msdn.microsoft.com/en-us/library/ms724509(VS.85).aspx //その他, //NtQuerySystemInformation //NtQuerySystemInformation Delphi //でネットを検索すると情報あり _SYSTEM_PROCESS_INFORMATION = packed record dNext: DWORD; dThreadCount: DWORD; dReserved01: DWORD; dReserved02: DWORD; dReserved03: DWORD; dReserved04: DWORD; dReserved05: DWORD; dReserved06: DWORD; qCreateTime: LARGE_INTEGER; qUserTime: LARGE_INTEGER; qKernelTime: LARGE_INTEGER; usLength: WORD; usMaximumLength: WORD; usName: Pointer; BasePriority: DWORD; dUniqueProcessId: DWORD; dInheritedFromUniqueProcessId: DWORD; dHandleCount: DWORD; dReserved07: DWORD; dReserved08: DWORD; PeakVirtualSize: DWORD; VirtualSize: DWORD; PageFaultCount: DWORD; PeakWorkingSetSize: DWORD; WorkingSetSize: DWORD; QuotaPeakPagedPoolUsage: DWORD; QuotaPagedPoolUsage: DWORD; QuotaPeakNonPagedPoolUsage: DWORD; QuotaNonPagedPoolUsage: DWORD; PagefileUsage: DWORD; PeakPagefileUsage: DWORD; dCommitCharge: DWORD; end; TSYSTEM_PROCESS_INFORMATION = _SYSTEM_PROCESS_INFORMATION; PSYSTEM_PROCESS_INFORMATION = ^TSYSTEM_PROCESS_INFORMATION; //Dll内の関数の利用方法は他にもあり function NtQuerySystemInformation(pSystemInformationClass: Integer; pSystemInformation: Pointer; pSystemInformationLength: Integer; pReturnLength: Pointer): Integer; stdcall; //このサンプルでは1しか使用しないが定義しておく const SystemBasicInformation = 0; SystemPerformanceInformation = 2; SystemTimeOfDayInformation = 3; SystemProcessInformation = 5; SystemProcessorPerformanceInformation = 8; SystemInterruptInformation = 23; SystemExceptionInformation = 33; SystemRegistryQuotaInformation = 37; SystemLookasideInformation = 45; var Form1: TForm1; implementation {$R *.dfm} function NtQuerySystemInformation; external 'ntdll.dll' name 'NtQuerySystemInformation'; procedure TForm1.FormShow(Sender: TObject); begin ListView1.Columns.Add; ListView1.Columns[0].Width := 200; ListProcessName; end; procedure TForm1.ListProcessName; var Cnt : Integer; AInfo : PSYSTEM_PROCESS_INFORMATION; AItem : TListItem; begin //プロセス情報取得 if (NtQuerySystemInformation(SystemProcessInformation, @ABuffer, SizeOf(ABuffer), nil) = 0) then begin //ListViewにプロセス名のみ表示 //プロセス名以外の情報はAInfoレコード型の各メンバーから取得可能 Cnt := 0; while (True) do begin AInfo := @ABuffer[Cnt]; AItem := ListView1.Items.Add; AItem.Caption := PWideChar(AInfo.usName); if (AInfo.dNext = 0) then Break; Inc(Cnt, AInfo.dNext); end; end; end; end.
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.