起動しているアプリケーションの情報を調べる

最終更新 2003 10/15

サンプルのダウンロード → API_CreateToolhelp32Snapshot.lzh(38k)

サンプルプログラムのスクリーンショット

全ソースコード



CreateToolhelp32Snapshot 関数
Process32First 関数
Process32Next 関数
    
    対応しているバージョン
    95, 98, Me, NT5.0以降, 2000, XP
        
    使用するヘッダとライブラリ
    tlhelp32.h
    kernel32.lib
起動しているアプリケーションの情報を調べるには CreateToolhelp32Snapshot() 関数を使います。 具体的には
・現在起動しているアプリケーションの実行ファイル名 ・プロセスID ・親プロセスID ・モジュールID ・デフォルトヒープID ・使用しているスレッド数 ・スレッドの優先順位
が分かります。 モジュールIDとデフォルトヒープIDについてはよく分かりません。 プロセスIDは、起動しているアプリケーションに割り当てられている識別番号 みたいなのもだと思います。 起動しているアプリケーションは、それぞれ別々のIDを持っています。 プロセスIDが重複することはないと思います。 多分、アプリケーションを特定する時とかに使ったりできるんじゃないでしょうか。 このプロセスIDは適当につけているっぽぃので、例えばメモ帳のプロセスIDが 常に100になるとは限りません。 親プロセスIDは、起動しているアプリケーションが別のアプリケーションから 起動して動いている時の、親のプロセスIDです。 ここの値を見ることで、どのアプリケーションが親なのかが分かります。 親ウィンドウと子ウィンドウの関係のようなものないでしょうか・・・。 使用しているスレッド数ですが、スレッドはプログラム中に自分でスレッドを 追加しない限り1つのプログラムに1つです。 スレッドを使うと、複数の処理を同時に実行することができます。 例えば、画面を描画するスレッド、データを集計するスレッドを作成すると 画面を描画しながらデータを集計することができます。 それぞれのスレッドは独立しているので、スレッドを削除するまで、あるいは スレッドに関連づけされた処理が終了するまで、処理を延々と繰り返します。 ゲームなんかでもうまく使う方法があるとは思いますが、複数のスレッドを使うと それぞれのスレッドと同期をとるのがめんどうなので、自分は使用しません。 スレッドの優先順位はアプリケーションの処理の優先順位と同じような意味です。 優先順位の高いアプリケーションほど集中して処理を行うので、実行速度が速く なります。パフォーマンスが向上するって言うんでしょうか。 アクションゲームなんかでは、できるだけ処理を速くしたいので、優先順位を 一番高い順位に変更したりなんかします。 優先順位を変更する方法は別の項で説明します。 サンプルだとリストビューに情報を格納する処理などの余計な部分があるので ゴチャゴチャしていますが、アプリケーションの情報を取り出す部分だけを 抜き出すと以下のようになります。
HANDLE         snapshot;
PROCESSENTRY32 process;

process.dwSize = sizeof( PROCESSENTRY32 );
snapshot = CreateToolhelp32Snapshot( TH32CS_SNAPALL, 0 );
    
BOOL status = Process32First( snapshot, &process );
while( status )
{
    status = Process32Next( snapshot, &process );
}
CreateToolhelp32Snapshot() 関数、Process32First() 関数 Process32Next() 関数を使用するには tlhelp32.h をインクルードします。 kernel32.lib はVCではデフォルトで読み込まれるので、あえて読み込む 必要はないと思います。 上のサンプルだと、受け取ったアプリケーションの情報は process に 格納されます。 情報を取得したら process のメンバ変数を調べれば良いわけですねぇ〜。 CreateToolhelp32Snapshot() でアプリケーションの情報を受け取るための ハンドルを取得して、Process32First() で最初のアプリケーション情報を 取得します。 この時の戻り値を変数に保存しておき、変数の値が FALSE の場合は 情報取得終了。 TRUE の場合は Process32Next() で次のアプリケーションの情報を取得して いきます。 以降は while で Process32Next() の戻り値が FALSE になるまでループ させます。 メンバ変数と、メンバ変数の説明を以下に書きます。 szExeFile 現在起動しているアプリケーションの実行ファイル名 th32ProcessID プロセスID th32ParentProcessID 親プロセスID th32ModuleID モジュールID th32DefaultHeapID デフォルトヒープID cntThreads 使用しているスレッド数 pcPriClassBase スレッドの優先順位 「この情報を調べて何かできるの?」と言われると、「いや、別に・・・。」と 言うしかないのですが、とりあえず、やってみたかったのでやってみたと・・・。

| home |