直接贴代码吧,在main函数中调用即可:
头文件必不可少:
#include <windows.h> #include <tlhelp32.h>
实现函数:
bool isProcessExist() { HANDLE hProcessSnap; PROCESSENTRY32 pe32; DWORD dwPid = 0; int nProcCount = 0; // 截取系统中运行进程的快照 hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) { return false; } pe32.dwSize = sizeof(PROCESSENTRY32); if (!Process32First(hProcessSnap, &pe32)) { CloseHandle(hProcessSnap); // clean the snapshot object return false; } // 获取自己程序的进程名,用于比对 TCHAR szFileFullPath[_MAX_PATH] = {0}; ::GetModuleFileName(NULL, static_cast<LPTSTR>(szFileFullPath), _MAX_PATH); int iLength = 0; char szFullPath[_MAX_PATH] = {0}; //获取字节长度 iLength = WideCharToMultiByte(CP_ACP, 0, szFileFullPath, -1, NULL, 0, NULL, NULL); //将tchar值赋给_char WideCharToMultiByte(CP_ACP, 0, szFileFullPath, -1, szFullPath, iLength, NULL, NULL); std::string strProcPath = szFullPath; // 得到自身进程名 std::string szProcName = strProcPath.substr(strProcPath.find_last_of("\\") + 1); bool bRet = false; char szPeProcName[_MAX_PATH] = {0}; do { // 遍历进程快照,比对是否有同名进程 memset(szPeProcName, 0, _MAX_PATH); // wchar 转 char* sprintf(szPeProcName, "%ws", pe32.szExeFile ); if (0 == strcmp(szProcName.c_str(), szPeProcName)) { dwPid = pe32.th32ProcessID; ++nProcCount; if (nProcCount > 1) { // 不止有一个进程 bRet = true; break; } } } while (Process32Next(hProcessSnap, &pe32)); CloseHandle(hProcessSnap); return bRet; }
当有且仅有一个同名进程时返回false,大于一个时返回true,后续操作看各位的了。
