psapi或windows.h中是否有任何函数可以通过进程名称(例如:“chrome.exe”)运行,而不需要获取所有进程。
编辑:
如果任何人需要通过运行所有进程列表来获取所需的进程信息,我可以在此处粘贴我的代码。它适用于xp-machine并使用vs 2008进行编译。
我也为我的问题找到了解决方案!但是根据msdn,函数已经通过进程运行并检查没有扩展名的名称。不久,它会搜索“chrome”并返回chrome列表。*
这个函数有一个很好的优点,它返回列表中的进程,它可能是一个exe可能与may实例一起运行。缺点CLR是必需的,它运行速度比psapi函数慢,并且它有额外的转换要求,例如String ^ to wchar或String(我没有测试过)
答案 0 :(得分:6)
上面的答案适用于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;
}
答案 1 :(得分:1)
#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;
}
答案 2 :(得分:1)
您可以使用上面给出的CreateToolhelp32Snapshot。如果您需要定期轮询该流程,请在您发现流程ID运行后保存流程ID,然后使用OpenProcess进行检查。这要快很多倍,但请注意操作系统会回收PID,因此您必须处理这些问题。
如果您对流程的内部知识有所了解(甚至可以控制它),还有其他选项,例如检查:
此问题的答案中提供了更多详细信息:Fast way to check for a specific process running