zoukankan      html  css  js  c++  java
  • Windows编程之进程遍历(C++实现)

           Windows编程之进程遍历

    PS: 主要扣代码使用,直接滑动到最下面使用.

    遍历进程需要几个API,和一个结构体

      1.创建进程快照

      2.遍历首次进程

      3.继续下次遍历

      4.进程信息结构体

    API 分别是:

    1.创建进程快照

    HANDLE WINAPI CreateToolhelp32Snapshot(      进程快照API
      DWORD dwFlags,                       遍历的标志,表示你要遍历什么(进程,模块,堆...)
      DWORD th32ProcessID                   遍历的进程ID,如果为0,则是当前进程,如果不为0,则是创建指定进程的快照进行遍历
    );

    注意,创建进程快照需要包含头文件  Tlhelp32.h

    返回值:

      成功返回快照句柄

      失败返回 INVALID_HANDLE_VALUE

    2.遍历首次进程.

    BOOL WINAPI Process32First(
      HANDLE hSnapshot,          进程快照句柄
      LPPROCESSENTRY32 lppe      传入进程信息结构体,系统帮你填写.
    );
    进程信息结构体

    typedef struct tagPROCESSENTRY32 { 
      DWORD dwSize;               进程信息结构体大小,首次调用之前必须初始化
      DWORD cntUsage;              引用进程的次数,引用次数为0时,则进程结束
      DWORD th32ProcessID;           进程的ID
      ULONG_PTR th32DefaultHeapID;       进程默认堆的标识符,除工具使用对我们没用
      DWORD th32ModuleID;                  进程模块的标识符
      DWORD cntThreads;             进程启动的执行线程数
      DWORD th32ParentProcessID;           父进程ID
      LONG  pcPriClassBase;          进程线程的基本优先级
      DWORD dwFlags;              保留
      TCHAR szExeFile[MAX_PATH];          进程的路径
    } PROCESSENTRY32; 
    typedef PROCESSENTRY32 *PPROCESSENTRY32; 

    对我们有用的就是
    dwSize         初始化结构体的大小
    th32ProcessId 进程ID
    szExeFile[MAX_PATH] 进程路径

    3.遍历下一次进程
    BOOL WINAPI Process32Next(
      HANDLE hSnapshot,        进程句柄
      LPPROCESSENTRY32 lppe     进程信息结构体
    );

    兼容代码
    #include <windows.h>
    #include <Tlhelp32.h>
    int main(int argc, char* argv[])
    {
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        if (INVALID_HANDLE_VALUE == hSnapshot)
        {
            return 0;
        }
        PROCESSENTRY32 pi; 
        pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必须初始化成员
        BOOL bRet = Process32First(hSnapshot,&pi);
        while (bRet)
        {
            /*
            循环遍历添加自己的额外代码
            */    
            bRet = Process32Next(hSnapshot,&pi);
        }
        return 0;
    }

    自己写的测试输出代码.

    #include <stdio.h>
    #include <windows.h>
    #include <Tlhelp32.h>
    int main(int argc, char* argv[])
    {
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        if (INVALID_HANDLE_VALUE == hSnapshot)
        {
            return 0;
        }
        PROCESSENTRY32 pi; 
        pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必须初始化成员
        BOOL bRet = Process32First(hSnapshot,&pi);
        while (bRet)
        {
            /*
            循环遍历添加自己的额外代码
            */    
            printf("进程ID = %d ,进程路径 = %s
    ",pi.th32ProcessID,pi.szExeFile);
            bRet = Process32Next(hSnapshot,&pi);
        }
        return 0;
    }

    输出内容

    常用代码之根据进程名返回对应PID

    DWORD PsGetProcessIdByProcessName(LPTSTR ProcessName)
    {
    #ifdef UNICODE
        std::wstring ChekName;
        std::wstring tempChekName;
    #else
        std::string  ChekName;
        std::string tempChekName;
    #endif
        tempChekName = ProcessName;
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        if (INVALID_HANDLE_VALUE == hSnapshot)
        {
            return FALSE;
        }
        PROCESSENTRY32 pi;
        pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必须初始化成员
        BOOL bRet = Process32First(hSnapshot, &pi);
    
        transform(tempChekName.begin(), tempChekName.end(), tempChekName.begin(), ::tolower);
    
        while (bRet)
        {
    
            ChekName = pi.szExeFile;
            transform(ChekName.begin(), ChekName.end(), ChekName.begin(), ::tolower);
    
            //大写转小写进行配置
            if (ChekName.find(tempChekName) != ChekName.npos)
            {
                //找到了
                return pi.th32ProcessID;
            }
            bRet = Process32Next(hSnapshot, &pi);
        }
        return FALSE;
    
    }
    

      

    常用代码之根据PID 返回进程名

    #ifdef UNICODE
    std::wstring PsGetProcessNameByProcessId(DWORD pid)
    {
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        if (INVALID_HANDLE_VALUE == hSnapshot)
        {
            return FALSE;
        }
        PROCESSENTRY32 pi;
        pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必须初始化成员
        BOOL bRet = Process32First(hSnapshot, &pi);
    
        while (bRet)
        {
    
            //大写转小写进行配置
            if (pid == pi.th32ProcessID)
            {
                //找到了
                return pi.szExeFile;
            }
            bRet = Process32Next(hSnapshot, &pi);
        }
        return FALSE;
    }
    #else
    std::string PsGetProcessNameByProcessId(DWORD pid)
    {
    
        HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        if (INVALID_HANDLE_VALUE == hSnapshot)
        {
            return FALSE;
        }
        PROCESSENTRY32 pi;
        pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必须初始化成员
        BOOL bRet = Process32First(hSnapshot, &pi);
    
        while (bRet)
        {
    
            //大写转小写进行配置
            if (pid == pi.th32ProcessID)
            {
                //找到了
                return pi.szExeFile;
            }
            bRet = Process32Next(hSnapshot, &pi);
        }
        return FALSE;
    }
    #endif
    

      

     根据进程PID杀掉进程

    BOOL PsKillProcess(LPTSTR KillProcessName)
    {
        //杀掉进程
        /*
        杀掉进程方式很多种
        1.TerminateProcess
        2.循环遍历线程,结束线程
        3.遍历内存.设置内存可读属性为 不可访问.让其异常自己推出
        4.调用NT函数ZwUnmapViewOfSection 取消它的映射
        5.内核 中内存清零法 强杀进程
        .... 思路很多.可以搞的地方也很多.
        */
        DWORD dwPid = PsGetProcessIdByProcessName(KillProcessName);
        HANDLE hProcess = NULL;
        if (dwPid != 0)
        {
            hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
            if (hProcess != NULL)
            {
                TerminateProcess(hProcess,0);
            }
        }
        return 0;
    }
    

      

     关于OpenProcess 打不开进程得解决方案如下
    https://www.cnblogs.com/iBinary/p/10749280.html
  • 相关阅读:
    Java vs Python
    Compiled Language vs Scripting Language
    445. Add Two Numbers II
    213. House Robber II
    198. House Robber
    276. Paint Fence
    77. Combinations
    54. Spiral Matrix
    82. Remove Duplicates from Sorted List II
    80. Remove Duplicates from Sorted Array II
  • 原文地址:https://www.cnblogs.com/iBinary/p/8159426.html
Copyright © 2011-2022 走看看