Partager via


Énumération de tous les processus

L’exemple de code suivant utilise la fonction EnumProcesses pour récupérer l’identificateur de processus pour chaque objet de processus dans le système. EnumProcessModules est ensuite appelé pour obtenir le nom de chaque processus et l’imprimer.

Notes

Pour les processus 64 bits, utilisez la fonction EnumProcessModulesEx .

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <psapi.h>

// To ensure correct resolution of symbols, add Psapi.lib to TARGETLIBS
// and compile with -DPSAPI_VERSION=1

void PrintProcessNameAndID( DWORD processID )
{
    TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");

    // Get a handle to the process.

    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                   PROCESS_VM_READ,
                                   FALSE, processID );

    // Get the process name.

    if (NULL != hProcess )
    {
        HMODULE hMod;
        DWORD cbNeeded;

        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), 
             &cbNeeded) )
        {
            GetModuleBaseName( hProcess, hMod, szProcessName, 
                               sizeof(szProcessName)/sizeof(TCHAR) );
        }
    }

    // Print the process name and identifier.

    _tprintf( TEXT("%s  (PID: %u)\n"), szProcessName, processID );

    // Release the handle to the process.

    CloseHandle( hProcess );
}

int main( void )
{
    // Get the list of process identifiers.

    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;

    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
    {
        return 1;
    }


    // Calculate how many process identifiers were returned.

    cProcesses = cbNeeded / sizeof(DWORD);

    // Print the name and process identifier for each process.

    for ( i = 0; i < cProcesses; i++ )
    {
        if( aProcesses[i] != 0 )
        {
            PrintProcessNameAndID( aProcesses[i] );
        }
    }

    return 0;
}

La fonction main obtient une liste de processus à l’aide de la fonction EnumProcesses. Pour chaque processus, main appelle la fonction PrintProcessNameAndID, en lui transmettant l’identificateur de processus. PrintProcessNameAndID appelle à son tour la fonction OpenProcess pour obtenir le handle de processus. En cas d’échec d’OpenProcess , la sortie affiche le nom du processus comme <inconnu>. Par exemple, OpenProcess échoue pour les processus Inactifs et CSRSS, car leurs restrictions d’accès empêchent le code au niveau de l’utilisateur de les ouvrir. Ensuite, PrintProcessNameAndID appelle la fonction EnumProcessModules pour obtenir les handles de module. Enfin, PrintProcessNameAndID appelle la fonction GetModuleBaseName pour obtenir le nom du fichier exécutable et affiche le nom avec l’identificateur du processus.