是否有任何在psapi或windows.h中的函数来获取所需的进程“只通过进程名称(例如:”chrome.exe“)运行,而没有获得所有进程。
编辑:
如果任何人需要通过运行所有进程列表来获得所需的进程信息,我可以在这里粘贴我的代码。 它在xp机器上工作,并与VS 2008编译。
我也find了我的问题的解决scheme! 但是根据msdn ,函数已经通过过程运行并检查没有扩展名。 不久,它search“chrome”并返回chrome列表。
这个函数有一个很好的优点,它返回一个列表中的进程,它可能是一个exe可能运行may实例。 缺点CLR是必需的,它运行比psapi函数慢,它有额外的转换要求,如String ^到wchar或String(我没有testing过)
上面的答案在win 8上工作。在这里没有wstring的东西,并剥离的路径
#include <tlhelp32.h> DWORD FindProcessId(char* processName) { // strip path char* p = strrchr(processName, '\\'); if(p) processName = p+1; PROCESSENTRY32 processInfo; processInfo.dwSize = sizeof(processInfo); HANDLE processesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if ( processesSnapshot == INVALID_HANDLE_VALUE ) return 0; Process32First(processesSnapshot, &processInfo); if ( !strcmp(processName, processInfo.szExeFile) ) { CloseHandle(processesSnapshot); return processInfo.th32ProcessID; } while ( Process32Next(processesSnapshot, &processInfo) ) { if ( !strcmp(processName, processInfo.szExeFile) ) { CloseHandle(processesSnapshot); return processInfo.th32ProcessID; } } CloseHandle(processesSnapshot); return 0; }
#include "stdafx.h" #include <windows.h> #include <tlhelp32.h> #include <iostream> using namespace std; DWORD FindProcessId(const std::wstring& processName); int main(int argc, char* argv[]) { bool bAnyBrowserIsOpen = false; if ( FindProcessId(L"chrome.exe") || FindProcessId(L"firefox.exe") || FindProcessId(L"iexplore.exe")) { bAnyBrowserIsOpen = true; } return 0; } DWORD FindProcessId(const std::wstring& processName) { PROCESSENTRY32 processInfo; processInfo.dwSize = sizeof(processInfo); HANDLE processesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if ( processesSnapshot == INVALID_HANDLE_VALUE ) return 0; Process32First(processesSnapshot, &processInfo); if ( !processName.compare(processInfo.szExeFile) ) { CloseHandle(processesSnapshot); return processInfo.th32ProcessID; } while ( Process32Next(processesSnapshot, &processInfo) ) { if ( !processName.compare(processInfo.szExeFile) ) { CloseHandle(processesSnapshot); return processInfo.th32ProcessID; } } CloseHandle(processesSnapshot); return 0; }
您可以使用上面给出的CreateToolhelp32Snapshot。 如果您需要定期轮询流程,请在找到流程ID后保存流程ID,然后使用OpenProcess进行检查。 这要快很多倍,但要注意操作系统回收PID,所以你必须处理这个问题。
如果你对流程内部有了一些了解(甚至可以控制流程),还有其他的选择,比如检查:
更多的细节在这个问题的答案中给出: 快速的方法来检查特定的进程运行