我们这根据名字查找进程,获取其ID
1 /*@brief 获取找到的与指定进程名相符的第一个进程ID 2 * @param [in] cpszExeFileName 进程可执行文件名(不带路径) 3 * @param [in/out] dwPID 返回找到的名字符合的第一个进程ID 4 * @return 成功 : S_OK 失败 : 错误码 5 */ 6 HRESULT FindFirstProcessIdByName(const TCHAR* cpszExeFileName, DWORD &dwPID) 7 { 8 HRESULT hr = E_FAIL; 9 10 PROCESSENTRY32 pe = { 0 }; 11 HANDLE hSnapshot = NULL; 12 13 if (NULL == cpszExeFileName) 14 { 15 hr = HRESULT_FROM_WIN32(ERROR_BAD_ARGUMENTS); 16 goto Exit0; 17 } 18 19 pe.dwSize = sizeof(PROCESSENTRY32);//在使用这个结构前,先设置它的大小 20 //可以获取系统中正在运行的进程信息,线程信息,等 21 hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 22 //TH32CS_SNAPPROCESS - 在快照中包含系统中所有的进程。 23 //TH32CS_SNAPTHREAD - 在快照中包含系统中所有的线程。
//TH32CS_SNAPALL - 在快照中包含系统中所有的进程和线程。 24 //第二个参数 25 //一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时可以设为0 26 27 if (INVALID_HANDLE_VALUE == hSnapshot) 28 { 29 hr = HRESULT_FROM_WIN32(GetLastError()); 30 goto Exit0; 31 } 32 33 if (FALSE == Process32First(hSnapshot, &pe)) 34 { 35 hr = HRESULT_FROM_WIN32(ERROR_NO_MORE_FILES); 36 goto Exit0; 37 } 38 39 hr = S_FALSE; 40 do 41 { 42 std::wcout << (std::wstring)pe.szExeFile << L",ID: " << pe.th32ProcessID << std::endl;; 43 if (0 == _tcscmp(cpszExeFileName, pe.szExeFile)) 44 { 45 dwPID = pe.th32ProcessID; 46 hr = S_OK; 47 break; 48 } 49 } while (Process32Next(hSnapshot, &pe)); 50 51 Exit0: 52 if (hSnapshot) 53 { 54 CloseHandle(hSnapshot); 55 hSnapshot = NULL; 56 } 57 58 return hr; 59 }
2.根据进程ID查找窗口句柄
typedef struct { HWND hwndWindow; // 窗口句柄 DWORD dwProcessID; // 进程ID }EnumWindowsArg; // 枚举窗口回调函数 BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { EnumWindowsArg *pArg = (EnumWindowsArg *)lParam; DWORD dwProcessID = 0; // 通过窗口句柄取得进程ID ::GetWindowThreadProcessId(hwnd, &dwProcessID); if (dwProcessID == pArg->dwProcessID) { pArg->hwndWindow = hwnd; // 找到了返回FALSE return FALSE; } // 没找到,继续找,返回TRUE return TRUE; } HWND GetWindowHwndByPID(const DWORD dwProcessID) { HWND hwndRet = NULL; EnumWindowsArg ewa; ewa.dwProcessID = dwProcessID; ewa.hwndWindow = NULL; EnumWindows(EnumWindowsProc, (LPARAM)&ewa); if (ewa.hwndWindow) { hwndRet = ewa.hwndWindow; } return hwndRet; }