Windowsにて現在起動しているプロセス名を列挙する方法をメモ
プロセスの列挙には下記の関数を利用する
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);
dwFlagsにはどのスナップショットを取得したいかを指定できる。
具体的には、TH32CS_SNAPPROCESSの他に
TH32CS_SNAPHEAPLIST // ヒープのリスト
TH32CS_SNAPMODULE // モジュールのリスト
などが指定できる。
th32ProcessIDはプロセスの列挙の場合0を指定すればよい。
スナップショットの内容は、Process32First()/Process32Next()を利用して、戻り値がFALSEになるまで呼ぶことで走査できる。
サンプルコード
#include <iostream>
#include <vector>
#include <string>
#include <Windows.h>
#include <TlHelp32.h>
typedef std::vector<std::wstring> ModuleNameList;
// 現在起動しているプロセス名のリストを返す
ModuleNameList getModuleList() {
ModuleNameList module_name_list;
// スナップショットを取得
HANDLE snapshot = ::CreateToolhelp32Snapshot(
TH32CS_SNAPPROCESS, 0
);
if(snapshot == INVALID_HANDLE_VALUE)
throw std::exception();
// プロセスの情報を走査
PROCESSENTRY32W entry;
entry.dwSize = sizeof(entry);
BOOL has_entry = ::Process32FirstW(snapshot, &entry);
while(has_entry) {
module_name_list.push_back(entry.szExeFile);
has_entry = ::Process32NextW(snapshot, &entry);
}
::CloseHandle(snapshot);
return module_name_list;
}
int wmain(int argc, wchar_t* argv[]) {
const auto list = ::getModuleList();
for(auto name : list) {
std::wcout << name.c_str() << std::endl;
}
return 0;
}
出力結果例
[System Process]
System
smss.exe
csrss.exe
wininit.exe
...
Visual Studio 2013にて動作確認済み