ソフトウェア開発 Win32プログラミング

プロセスの生成・破棄を監視する

戻る


プロセスの生成・破棄を監視するコードは以下の通り。

#include <windows.h>
#include <tlhelp32.h>
#include <vector>
#include <iostream>
using namespace std;
 
int main(void)
{
    HANDLE hSnapshot;
    PROCESSENTRY32 pe32;
    vector<PROCESSENTRY32> plist1, plist2;
    vector<PROCESSENTRY32> newlist, oldlist;
    SIZE_T i, j;
    BOOL bFound;
 
    // 起動したら、最初にプロセスリストを取得する。
    //plist1.clear();
    hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    pe32.dwSize = sizeof(pe32);
    if (::Process32First(hSnapshot, &pe32))
    {
        do {
            plist1.push_back(pe32);
        } while(::Process32Next(hSnapshot, &pe32));
    }
    CloseHandle(hSnapshot);
 
    // 無限ループ(止めたいときはCtrl+Cを押す)。
    for(;;)
    {
        // 古いプロセスリストをplist2に代入する。
        plist2 = plist1;
 
        // 新しいプロセスリストをplist1に格納する。
        plist1.clear();
        hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        pe32.dwSize = sizeof(pe32);
        if (::Process32First(hSnapshot, &pe32))
        {
            do {
                plist1.push_back(pe32);
            } while(::Process32Next(hSnapshot, &pe32));
        }
        ::CloseHandle(hSnapshot);
 
        // 2つのプロセスリストを比較する。
        newlist.clear();
        oldlist.clear();
        for(i = 0; i < plist1.size(); i++)
        {
            bFound = FALSE;
            for(j = 0; j < plist2.size(); j++)
            {
                if (plist1[i].th32ProcessID == plist2[j].th32ProcessID)
                {
                    bFound = TRUE;
                    break;
                }
            }
            if (!bFound)
                newlist.push_back(plist1[i]);
        }
        for(j = 0; j < plist2.size(); j++)
        {
            bFound = FALSE;
            for(i = 0; i < plist1.size(); i++)
            {
                if (plist1[i].th32ProcessID == plist2[j].th32ProcessID)
                {
                    bFound = TRUE;
                    break;
                }
            }
            if (!bFound)
                oldlist.push_back(plist2[j]);
        }
 
        // 違いがあれば、現在の時刻を表示する。
        if (!oldlist.empty() || !newlist.empty())
        {
            SYSTEMTIME st;
            ::GetLocalTime(&st);
            printf("%02d:%02d:%02d\n", st.wHour, st.wMinute, st.wSecond);
        }
        // 破棄されたプロセスの情報を表示する。
        for(i = 0; i < oldlist.size(); i++)
        {
            printf("OLD: #%08X %s\n", oldlist[i].th32ProcessID,
                oldlist[i].szExeFile);
        }
        // 新しいプロセスの情報を表示する。
        for(i = 0; i < newlist.size(); i++)
        {
            printf("NEW: #%08X %s\n", newlist[i].th32ProcessID,
                newlist[i].szExeFile);
        }
        // CPUを浪費させないため、少し休ませる。
        ::Sleep(250);
    }
 
    return 0;
}

ソース: proclist.zip


戻る

©片山博文MZ
katayama.hirofumi.mz@gmail.com

inserted by FC2 system