#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,¤tProcess); //获取第一个进程信息while(bMore){if (wcscmp(currentProcess.szExeFile,processName)==0) //比较是否存在此进程{CloseHandle(hProcess); //清除hProcess句柄return true;}bMore=Process32Next(hProcess,¤tProcess); //遍历下一个}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,¤tProcess); //获取第一个进程信息while(bMore){if (wcscmp(currentProcess.szExeFile,processName)==0) //比较是否存在此进程{CloseHandle(hProcess); //清除hProcess句柄return currentProcess.th32ProcessID;}bMore=Process32Next(hProcess,¤tProcess); //遍历下一个}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