我们这根据名字查找进程,获取其ID
/*@brief 获取找到的与指定进程名相符的第一个进程ID
* @param [in] cpszExeFileName 进程可执行文件名(不带路径)
* @param [in/out] dwPID 返回找到的名字符合的第一个进程ID
* @return 成功 : S_OK 失败 : 错误码
*/
HRESULT FindFirstProcessIdByName(const TCHAR* cpszExeFileName, DWORD &dwPID)
{
HRESULT hr = E_FAIL; PROCESSENTRY32 pe = { };
HANDLE hSnapshot = NULL; if (NULL == cpszExeFileName)
{
hr = HRESULT_FROM_WIN32(ERROR_BAD_ARGUMENTS);
goto Exit0;
} pe.dwSize = sizeof(PROCESSENTRY32);//在使用这个结构前,先设置它的大小
//可以获取系统中正在运行的进程信息,线程信息,等
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, );
//TH32CS_SNAPPROCESS - 在快照中包含系统中所有的进程。
//TH32CS_SNAPTHREAD - 在快照中包含系统中所有的线程。
//TH32CS_SNAPALL - 在快照中包含系统中所有的进程和线程。
//第二个参数
//一个进程ID号,用来指定要获取哪一个进程的快照,当获取系统进程列表或获取 当前进程快照时可以设为0 if (INVALID_HANDLE_VALUE == hSnapshot)
{
hr = HRESULT_FROM_WIN32(GetLastError());
goto Exit0;
} if (FALSE == Process32First(hSnapshot, &pe))
{
hr = HRESULT_FROM_WIN32(ERROR_NO_MORE_FILES);
goto Exit0;
} hr = S_FALSE;
do
{
std::wcout << (std::wstring)pe.szExeFile << L",ID: " << pe.th32ProcessID << std::endl;;
if ( == _tcscmp(cpszExeFileName, pe.szExeFile))
{
dwPID = pe.th32ProcessID;
hr = S_OK;
break;
}
} while (Process32Next(hSnapshot, &pe)); Exit0:
if (hSnapshot)
{
CloseHandle(hSnapshot);
hSnapshot = NULL;
} return hr;
}
2.根据进程ID查找窗口句柄
typedef struct
{
HWND hwndWindow; // 窗口句柄
DWORD dwProcessID; // 进程ID
}EnumWindowsArg; // 枚举窗口回调函数
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
EnumWindowsArg *pArg = (EnumWindowsArg *)lParam;
DWORD dwProcessID = ;
// 通过窗口句柄取得进程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;
}