标 题: 快照枚举进程/直接枚举进程
作 者: 0xFFFFCCCC
时 间: 2013-04-12
链 接:
采用进程快照枚举进程的方法查找指定名称进程
BOOL FindProcessByName(LPCTSTR szFileName, PROCESSENTRY32& pe){ // 采用进程快照枚举进程的方法查找指定名称进程 HANDLE hProcesses; PROCESSENTRY32 lpe = { sizeof(PROCESSENTRY32) }; CString strFileName(szFileName); strFileName.MakeLower(); // 创建进程快照 hProcesses = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcesses == INVALID_HANDLE_VALUE) return FALSE; // 获取第一个进程实例 BOOL isExist = ::Process32First(hProcesses, &lpe); BOOL isRunning = FALSE; CString strName; while (isExist) { strName = lpe.szExeFile; strName.MakeLower(); if (-1 != strFileName.Find(strName)) { isRunning = TRUE; break; } // 遍历下一个进程实例 isExist = ::Process32Next(hProcesses, &lpe); } if (isRunning) { memcpy(&pe, &lpe, sizeof(PROCESSENTRY32)); } CloseHandle(hProcesses); return isRunning;}
直接枚举进程
BOOL FindProcessByName(LPCTSTR szFileName){ /************************************************************************/ // 采用直接枚举进程的方法查找指定名称进程 /* 名 称: FindProcessByName( LPCTSTR szFileName ) /* 功 能: 查询指定名称的进程是否有实例正在运行 /* 参 数: LPCTSTR szFileName, 可执行程序名称, 例如"c:\\notepad.exe" /* 返 回 值: BOOL.TRUE, 有同名实例正在运行; FALSE, 没有同名实例正在运行. /* 编 写 者: Xianren Li /* 创建日期: 2007-08-17 /* 附加说明: 请注意进程的查找只是依据名称, 无法确保找到的进程调用的是预料 /* 中的可执行文件. /* 修改记录: /************************************************************************/ CString strFileName(szFileName); strFileName.MakeLower(); DWORD aProcesses[1024], cbNeeded, cProcesses; if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded)) return FALSE; cProcesses = cbNeeded / sizeof(DWORD); TCHAR szProcessName[MAX_PATH] = TEXT(""); HANDLE hProcess; CString strName; BOOL isRunning = FALSE; for (unsigned int i = 0; i < cProcesses; i++) { hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]); if (NULL != hProcess) { HMODULE hMod; DWORD cbNeeded; if (::EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded)) { ::GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName) / sizeof(TCHAR)); strName = szProcessName; strName.MakeLower(); if (-1 != strFileName.Find(strName)) { isRunning = TRUE; CloseHandle(hProcess); break; } } CloseHandle(hProcess); } } return isRunning;}
很实用的代码来自