举个例子:运行windows自带的计算器,要得到它的进程ID,我用的方法是先FindWindow(NULL, "计算器")得到窗口句柄,然后再用GetWindowThreadProcessId这个函数即可。但这个方法并不是太好,我认为应该还有其他方法。所以请各位指教,是否能通过上述计算器的进程名(calc.exe)来获得它的进程ID?拜托各位,谢谢!

解决方案 »

  1.   

    static HANDLE hsnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS , 0 );
    static DWORD PID ;
    static int Memlen ;
    static PWSTR pszLibBaseAddr = NULL ;
    static char CurPath[256] ;
    static WCHAR wCurPath[256] ;
    int errcode ;
    HINSTANCE hInstance ;
    mydll remotedll ;
    PROCESSENTRY32 *PE32 = new PROCESSENTRY32 ;
    PE32->dwSize = sizeof( PROCESSENTRY32 ) ;
    bool find = false; if ( Process32First( hsnapShot , PE32 ))
    {
    if ( GetLastError() == ERROR_NO_MORE_FILES )
    return false ;
    while (Process32Next( hsnapShot , PE32 ) )
    {
    if ( strcmp( PE32->szExeFile , "notepad.exe" ) == 0 )
    {
    PID = PE32->th32ProcessID ;
    find = true ;
      break;
    }
    }
    }
    if ( find == false )
    {
    MessageBox( hWnd , "No this  notepad.exe process" ,"Error",0);
    return false;
    }
      

  2.   

    解释:
    1先建立一个进程的快照 static HANDLE hsnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS , 0 ) 并返回快照句柄
    2初始化PROCESSENTRY32且成员dwSize的值必须为该结构的大小
    PROCESSENTRY32 *PE32 = new PROCESSENTRY32 ;
    PE32->dwSize = sizeof( PROCESSENTRY32 ) ;
    3Process32First( hsnapShot , PE32 )获得系统中的第一个进程信息并保存在PE32中
    4Process32Next( hsnapShot , PE32 )遍历进程
    5strcmp( PE32->szExeFile , "notepad.exe" )和你要找的进程名比较
    6 Over
      

  3.   

    使用 EnumProcess 函数BOOL EnumProcesses(
      DWORD *lpidProcess,  // array of process identifiers
      DWORD cb,            // size of array
      DWORD *cbNeeded      // number of bytes returned
    );
    直接返回当前所有的进程ID,遍历就可以得到notepad的ID了。
      

  4.   

    问题解决了?用快照还是EnumProcesses的?要再给分,可以另外开送分贴,在贴子里面说明这个贴子的地址 :)
      

  5.   

    我做了些改进,另外strcmp会区分大小写字母,所以要换成_stricmp即可。DWORD CTmpDlg::GetProcessID(LPCTSTR FullProcessName)
    {
    DWORD PID;
    PROCESSENTRY32 pe32 = {0};
    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapShot != (HANDLE) -1) 
    {
    pe32.dwSize = sizeof(PROCESSENTRY32);
    if (Process32First(hSnapShot, &pe32))
    {
    while (Process32Next(hSnapShot, &pe32))
    {
    if (_stricmp(pe32.szExeFile, FullProcessName) == 0)
    {
    PID = pe32.th32ProcessID; 
    break;
    }
    }
    }
    }
    CloseHandle(hSnapShot);
    return PID;
    }