遍历进程

#include 
#include 
#include 
#include 
#include 

using std::wcout;


int main( )
{
    // 设置本地字符集
    setlocale( LC_ALL , "chs" );

    system( "pause" );

    // 1. 使用快照来遍历进程
    // 1.1 创建进程快照
    HANDLE hProcSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS , 0 );


    if( INVALID_HANDLE_VALUE == hProcSnap ) {
        printf( "创建进程快照失败\n" );
        return 0;
    }

    //typedef struct tagPROCESSENTRY32W
    //{
    //    DWORD   dwSize;                 // 结构体大小
    //    DWORD   cntUsage;               /// 不使用
    //    DWORD   th32ProcessID;          // this process
    //    ULONG_PTR th32DefaultHeapID;    /// 不使用
    //    DWORD   th32ModuleID;           /// 不使用
    //    DWORD   cntThreads;             // 进程的线程个数
    //    DWORD   th32ParentProcessID;    // 父进程ID
    //    LONG    pcPriClassBase;         // 进程优先级
    //    DWORD   dwFlags;                /// 不使用
    //    WCHAR   szExeFile[ MAX_PATH ];  // 进程名
    //} PROCESSENTRY32W;
    PROCESSENTRY32 processInfo ;

    // 初始化结构体的结构体字节字段
    processInfo.dwSize = sizeof( processInfo );

    // 获取第一个进程
    Process32First( hProcSnap , &processInfo );

    int i = 0;

    BOOL bTrue = FALSE;
    BOOL bRet = FALSE;
    TCHAR path[MAX_PATH];
    DWORD dwPathLengh = MAX_PATH;
    HANDLE hProc;


    do 
    {
        hProc = OpenProcess(PROCESS_QUERY_INFORMATION,/*打开的进程的权限*/
                            FALSE, /*打开进程得到的句柄是否继承给子进程*/
                            processInfo.th32ProcessID /*要打开的进程的ID*/
        );
        
        // 判断进行是否是32进程
        bRet = IsWow64Process(hProc,/*要判断的进程句柄*/
                              &bTrue/*输出值, 记录是否是32位进程,TRUE是32,FALSE为64*/
        );

        if (hProc == NULL)
            bRet = FALSE;

        // 将得到的进程信息输出
        wprintf(L"[%d],进程ID:%04d,父进程ID:%04d,进程优先级:%d,进  程名:%s[*%s]\n",
                i++,                                            //第一个参数
                processInfo.th32ProcessID,                      //第二个参数
                processInfo.th32ParentProcessID,                //第三个参数
                processInfo.pcPriClassBase,                    //第四个参数
                processInfo.szExeFile,                         //第五个参数
                (bRet && bTrue) ? L"32" : L"64");              //第六个参数,用三目运算符表示


        dwPathLengh = MAX_PATH;
        //if(GetProcessImageFileName(hProc, path, MAX_PATH))
        if (QueryFullProcessImageName(hProc, 0, path, &dwPathLengh))
        {
            wprintf(L"\t%s\n", path);
        }
        
        // 获取下一个进程
    } while (Process32Next(hProcSnap, &processInfo));


    system( "pause" );
}


你可能感兴趣的:(遍历进程)