网上也有类似的文章,但我用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;
}
//代码部分来自网络,供大家参考