windows获取进程信息函数

#ifndef PROCESS_H
#define PROCESS_H
#include <windows.h>
#include <vector>
#include <string>
#include <tlhelp32.h>
#include <stdio.h>

/**
 * 获取某个进程名称是否正在运行
 * @brief ProcessIsRunning
 * @param name
 * @return
 */
bool ProcessIsRunning(const wchar_t* processName){
    //拷贝数组
    PROCESSENTRY32 currentProcess;                        //存放快照进程信息的一个结构体
    currentProcess.dwSize = sizeof(currentProcess);        //在使用这个结构之前,先设置它的大小
    HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//给系统内的所有进程拍一个快照

    if (hProcess == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    bool bMore=Process32First(hProcess,&currentProcess);        //获取第一个进程信息
    while(bMore)
    {
        if (wcscmp(currentProcess.szExeFile,processName)==0)            //比较是否存在此进程
        {
            CloseHandle(hProcess);                                //清除hProcess句柄
            return true;
        }
        bMore=Process32Next(hProcess,&currentProcess);            //遍历下一个
    }

    CloseHandle(hProcess);    //清除hProcess句柄
    return false;
}

/**
 * 获取某个进程名称对应的进程id,未运行返回0
 * @brief GetProcessIdByProcessName
 * @param name
 * @return
 */
DWORD GetProcessIdByProcessName(const wchar_t* processName){
    //拷贝数组
    PROCESSENTRY32 currentProcess;                        //存放快照进程信息的一个结构体
    currentProcess.dwSize = sizeof(currentProcess);        //在使用这个结构之前,先设置它的大小
    HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//给系统内的所有进程拍一个快照

    if (hProcess == INVALID_HANDLE_VALUE)
    {
        return -1;
    }

    bool bMore=Process32First(hProcess,&currentProcess);        //获取第一个进程信息
    while(bMore)
    {
        if (wcscmp(currentProcess.szExeFile,processName)==0)            //比较是否存在此进程
        {
            CloseHandle(hProcess);    //清除hProcess句柄
            return currentProcess.th32ProcessID;
        }
        bMore=Process32Next(hProcess,&currentProcess);            //遍历下一个
    }

    CloseHandle(hProcess);    //清除hProcess句柄

    return 0;
}

/**
 * 获取正在运行的进程的id
 * @brief getRunningProcessIds
 * @return
 */
std::vector<DWORD> GetRunningProcessIds(){
    std::vector<DWORD> pIds;
    PROCESSENTRY32 pe32;
    pe32.dwSize=sizeof(pe32);
    HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if(hProcessSnap == nullptr){
        return pIds;
    }
    BOOL bMore=::Process32First(hProcessSnap,&pe32);
    while(bMore)
    {
      pIds.push_back(pe32.th32ProcessID);
      bMore=::Process32Next(hProcessSnap,&pe32);
    }
    //"不要忘记清楚掉snapshot
    ::CloseHandle(hProcessSnap);
    return pIds;
}

/**
 * 获取正在运行的进程名称
 * @brief getRunningProcessNames
 * @return
 */
std::vector<std::string> GetRunningProcessNames(){
    std::vector<std::string> pNames;
    PROCESSENTRY32 pe32;
    pe32.dwSize=sizeof(pe32);
    HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if(hProcessSnap == INVALID_HANDLE_VALUE){
        return pNames;
    }
    BOOL bMore=::Process32First(hProcessSnap,&pe32);
    while(bMore)
    {
      size_t size = WideCharToMultiByte(CP_UTF8, 0, pe32.szExeFile, -1, NULL, 0, NULL, NULL);;
      std::string pName(size,0);
      WideCharToMultiByte(CP_UTF8, 0, pe32.szExeFile, -1, &pName[0], size, nullptr, nullptr);
      pNames.push_back(pName);
      bMore=::Process32Next(hProcessSnap,&pe32);
    }
    printf("不要忘记清楚掉snapshot");
    ::CloseHandle(hProcessSnap);
    return pNames;
}
#endif // PROCESS_H

调用:

#include <iostream>
using namespace std;
#include "process.h"

int main()
{

//    vector<DWORD> ids = GetRunningProcessIds();
//    for(size_t i = 0; i < ids.size(); i++){
//        cout << "id:" << ids[i] << endl;
//    }

//    vector<string> names = GetRunningProcessNames();
//    for(size_t i = 0; i < names.size(); i++){
//        cout << "name:" << names[i] << endl;
//    }
    SetConsoleOutputCP(CP_UTF8);
    const wchar_t* processName = L"notepad++.exe";
    cout << "是否运行:" << ProcessIsRunning(processName) << endl;
    cout << "进程id:" << GetProcessIdByProcessName(processName) << endl;
    return 0;
}

运行结果:

是否运行:1
进程id:16652

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值