プロセスに関する時間情報を取得するには GetProcessTimes() 関数を利用します。(戻る)
- プロセスのハンドルを開く(OpenProcess)
- プロセスの時間情報を取得(GetProcessTimes)
- 世界協定時刻からローカル時間に変換(FileTimeToLocalFileTime)
- ファイル時刻からシステム時間に変換(FileTimeToSystemTime)
- プロセスのハンドルを閉じる(CloseHandle)
プロセスを開くときに PROCESS_QUERY_INFORMATION アクセス権を割り当てる必要があります。
取得可能な時間情報
- プロセスの作成時刻
- プロセスの終了時刻
- プロセスのカーネルモード動作時間
- プロセスのユーザーモード動作時間
時間情報はすべて FILETIME 構造体に格納されます。
プロトタイプ宣言
HANDLE OpenProcess( DWORD dwDesiredAccess, // アクセス・フラグ BOOL bInheritHandle, // ハンドルの継承オプション DWORD dwProcessId // プロセス識別子 ); BOOL CloseHandle( HANDLE hObject // オブジェクトのハンドル ); BOOL GetProcessTimes( HANDLE hProcess, // プロセスのハンドル LPFILETIME lpCreationTime, // プロセスの作成時刻 LPFILETIME lpExitTime, // プロセスの終了時刻 LPFILETIME lpKernelTime, // プロセスのカーネルモードでの動作時間 LPFILETIME lpUserTime // プロセスのユーザーモードでの動作時間 ); BOOL FileTimeToLocalFileTime( CONST FILETIME* lpFileTime, // 変更前の世界協定時刻(UTC) LPFILETIME lpLocalFileTime // 変換後のファイル時刻 ); BOOL FileTimeToSystemTime( CONST FILETIME* lpFileTime, // 変更前のファイル時刻 LPSYSTEMTIME lpSystemTime // 変更後のシステム日時 );
構造体
typedef struct _FILETIME { DWORD dwLowDateTime; // ファイル時刻の下位32ビット DWORD dwHighDateTime; // ファイル時刻の上位32ビット } FILETIME, *LPFILETIME; typedef struct _SYSTEMTIME { WORD wYear; // 年 WORD wMonth; // 月 WORD wDayOfWeek; // 曜日 WORD wDay; // 日 WORD wHour; // 時 WORD wMinute; // 分 WORD wSecond; // 秒 WORD wMilliseconds; // ミリ秒(1/1000) } SYSTEMTIME, *LPSYSTEMTIME;
共用体
typedef union _ULARGE_INTEGER { struct { DWORD LowPart; // 符号なしの32ビット整数(下位) DWORD HighPart; // 符号なしの32ビット整数(上位) } u; ULONGLONG QuadPart; // 符号なしの64ビット整数 } ULARGE_INTEGER, *LPULARGE_INTEGER;
サンプル
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <Psapi.h> // Psapi.Lib // ファイル時間から64ビット整数に変換 static ULONGLONG getTimeInt64( LPFILETIME ftTime ) { ULARGE_INTEGER u64Time; u64Time.u.LowPart = ftTime->dwLowDateTime; u64Time.u.HighPart = ftTime->dwHighDateTime; return u64Time.QuadPart; } // ファイル時間の加算 static LPFILETIME addFileTime( LPFILETIME ftTime1, LPFILETIME ftTime2 ) { static FILETIME ftTime; ULARGE_INTEGER u64Time1; ULARGE_INTEGER u64Time2; // 1セット u64Time1.u.LowPart = ftTime1->dwLowDateTime; u64Time1.u.HighPart = ftTime1->dwHighDateTime; // 2セット u64Time2.u.LowPart = ftTime2->dwLowDateTime; u64Time2.u.HighPart = ftTime2->dwHighDateTime; // 加算 u64Time1.QuadPart += u64Time2.QuadPart; // 変換 ftTime.dwLowDateTime = u64Time1.u.LowPart; ftTime.dwHighDateTime = u64Time1.u.HighPart; return &ftTime; } // ファイル時間から時間文字列に変換 static LPCTSTR getTimeString( LPTSTR lpBuff, LPFILETIME ftTime, BOOL bLocalTime ) { FILETIME ltTime; SYSTEMTIME stTime; if ( bLocalTime ){ FileTimeToLocalFileTime( ftTime, <Time ); } else{ ltTime = *ftTime; } FileTimeToSystemTime( <Time, &stTime ); wsprintf( lpBuff, TEXT("%04d/%02d/%02d(%.2s) %02d:%02d:%02d.%03d秒(%I64u)"), stTime.wYear, stTime.wMonth, stTime.wDay, &TEXT("日月火水木金土")[ stTime.wDayOfWeek * 2 ], stTime.wHour, stTime.wMinute, stTime.wSecond, stTime.wMilliseconds, getTimeInt64(ftTime) ); return lpBuff; } // メイン関数 int main( int argc, char *argv[] ) { TCHAR szBuff[ 1024 ]; DWORD dwProcessID = GetCurrentProcessId(); HANDLE hProcess; FILETIME ftMakeTime; // プロセスの作成時刻 FILETIME ftExitTime; // プロセスの終了時刻 FILETIME ftKernTime; // プロセスのカーネル動作時間 FILETIME ftUserTime; // プロセスのユーザー動作時間 if ( argc > 1 ){ dwProcessID = atoi( argv[1] ); } if ( (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID)) != NULL ){ if ( GetProcessTimes(hProcess,&ftMakeTime,&ftExitTime,&ftKernTime,&ftUserTime) ){ printf( TEXT("プロセスID :%lu\n"), dwProcessID ); printf( TEXT("プロセス・ハンドル :0x%p\n"), hProcess ); printf( TEXT("プロセスの作成時刻 :%s\n"), getTimeString(szBuff,&ftMakeTime,TRUE) ); printf( TEXT("プロセスの終了時刻 :%s\n"), getTimeString(szBuff,&ftExitTime,TRUE) ); printf( TEXT("プロセスのカーネル動作時間:%s\n"), getTimeString(szBuff,&ftKernTime,FALSE) ); printf( TEXT("プロセスのユーザー動作時間:%s\n"), getTimeString(szBuff,&ftUserTime,FALSE) ); printf( TEXT("プロセスのトータル動作時間:%s\n"), getTimeString(szBuff,addFileTime(&ftKernTime,&ftUserTime),FALSE) ); } else{ printf( TEXT("%lu:GetProcessTimes()関数のエラーです。\n"), GetLastError() ); } CloseHandle( hProcess ); return 0; } printf( TEXT("%lu:OpenProcess()関数のエラーです。\n"), GetLastError() ); return 1; }
- ヘッダファイルとして Psapi.h をインクルードします。
- インポートライブラリとして Psapi.Lib をリンクします。
関連記事
- プロセスの時間情報を取得
- プロセスのハンドル数を取得
- プロセスのメモリ情報を取得
- プロセスのメモリ・ページ情報を取得
- プロセスのI/O操作情報を取得
- プロセスのGDI/USERオブジェクトを取得
- プロセスの最大/最小ワーキングセットを取得
- プロセスのワーキングセットを最小化
- プロセスのセッションIDを取得
- プロセスの優先順位クラスを取得
※コメント投稿者のブログIDはブログ作成者のみに通知されます