网上也有类似的文章,但我用VS2013编译不通过,主要原因是进程信息szExeFile参数是WCHAR16位宽字节类型,所以需要转换,这里贴上代码
#include <stdio.h> #include <windows.h> #include "tlhelp32.h" DWORD GetPIDByName(WCHAR* name); WCHAR* AnsiToUnicode(const char* szStr);//转换格式 int main() { //WCHAR PN[260] = { 'J','i','s','u','P','d','f','.','e','x','e'};//这样写就不用转换 char ProcessName[260]=""; DWORD ProcessID; printf("请输入进程名\n"); scanf("%s", ProcessName); ProcessID = GetPIDByName(AnsiToUnicode(ProcessName)); printf("%d\n", ProcessID); system("pause"); } DWORD GetPIDByName(WCHAR* name) { PROCESSENTRY32 pe32; // 在使用这个结构之前,先设置它的大小 pe32.dwSize = sizeof(pe32); // 给系统内的所有进程拍一个快照 HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) { return -1; } // 遍历进程快照,轮流显示每个进程的信息 BOOL bMore = ::Process32First(hProcessSnap, &pe32); while (bMore) { if (strcmp((char*)pe32.szExeFile, (char*)name)==0) { return pe32.th32ProcessID; ::CloseHandle(hProcessSnap); } bMore = ::Process32Next(hProcessSnap, &pe32); } // 不要忘记清除掉snapshot对象 ::CloseHandle(hProcessSnap); return -1; } WCHAR* AnsiToUnicode(const char* szStr) { int nLen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szStr, -1, NULL, 0); if (nLen == 0) { return NULL; } wchar_t* pResult = new wchar_t[nLen]; MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szStr, -1, pResult, nLen); return pResult; } //代码部分来自网络,供大家参考