Last Updated 2002/02/06
Programming Tips Windows  索 引 
アプリケーションの列挙
2002/02/06

現在実行しているアプリケーションを列挙するには,以下の様にする.
Windows95 系と WindowsNT 系で分ける必要がある.

タスクリスト

Windows95 系

int GetModuleFileName95(HWND hWnd, HMODULE hModule, LPSTR lpszFile, int nSize)
{
    HANDLE hSnapshot;
    HANDLE (WINAPI *CreateToolhelp32Snapshot)(DWORD, DWORD);
    BOOL (WINAPI *Process32First)(HANDLE, LPPROCESSENTRY32);
    BOOL (WINAPI *Process32Next)(HANDLE, LPPROCESSENTRY32);

    HMODULE hKernel;
    PROCESSENTRY32 pe32;
    DWORD dwProcessId;
    int nRet;

    lpszFile[0] = '\0';

    nRet = lstrlen(lpszFile);

    GetWindowThreadProcessId(hWnd, &dwProcessId);

    hKernel = GetModuleHandle("kernel32.dll");

    CreateToolhelp32Snapshot = (HANDLE (WINAPI *)(DWORD, DWORD))
                               GetProcAddress(hKernel, "CreateToolhelp32Snapshot" );

    Process32First = (BOOL (WINAPI *)(HANDLE, LPPROCESSENTRY32))
                     GetProcAddress(hKernel, "Process32First") ;
    Process32Next  = (BOOL (WINAPI *)(HANDLE, LPPROCESSENTRY32))
                     GetProcAddress(hKernel, "Process32Next")  ;

    if( (CreateToolhelp32Snapshot == NULL) ||
        (Process32First           == NULL) ||
        (Process32Next            == NULL) ) {
        return(nRet);
    }

    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if( hSnapshot == NULL ) {
        return(nRet);
    }

    memset(&pe32, 0, sizeof(pe32));
    pe32.dwSize = sizeof(pe32);

    Process32First(hSnapshot, &pe32);
    do {
        if (pe32.th32ProcessID == dwProcessId) {
            lstrcpyn(lpszFile, pe32.szExeFile, nSize);
            nRet = lstrlen(lpszFile);
            break;
        }
    } while (Process32Next(hSnapshot, &pe32) != FALSE);

    CloseHandle(hSnapshot);

    return(nRet);
}


WindowsNT 系

    DWORD dwProcessID;
    GetWindowThreadProcessId(hWnd, &dwProcessID);

    HANDLE hProcess;
    hProcess = OpenProcess( (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ),
                            FALSE,
                            dwProcessID);
    if( hProcess != NULL ) {
        HMODULE hMod    ;
        DWORD   cbNeeded;

        if( EnumProcessModules(hProcess,
                               &hMod,
                               sizeof(hMod),
                               &cbNeeded) != NULL) {
            GetModuleFileNameEx(hProcess,
                                hMod,
                                chFileName,
                                (sizeof(chFileName) - 1) );
        }
    }


Microsoft Knowledge Baseの以下の文書が参考
文書番号:J041632
[SDK32]Win32 でアプリケーションを列挙する方法


参照
PSAPI
前後のTips
アプリケーションの列挙

DSS ProgrammingTipsCGI Ver2.02