#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