例如使用CreateToolhelp32Snaoshit函数取得了进程名的PID
但是现在不知道如何通过进程名取得GetWindowThreadProcessId获取进程ID号的呢?目前问题是一个程序他没有窗口获取不到窗口句柄,只能够通过进程名来获取
进程ID号。但问题不知道该如取获取这个ID号主要是为了用SEtwindowsHOOKEX去创建线程钩子。
但是现在不知道如何通过进程名取得GetWindowThreadProcessId获取进程ID号的呢?目前问题是一个程序他没有窗口获取不到窗口句柄,只能够通过进程名来获取
进程ID号。但问题不知道该如取获取这个ID号主要是为了用SEtwindowsHOOKEX去创建线程钩子。
void Fun_GettyProcessIDByName(CString strProcessName)
{
strProcessName.MakeUpper();
try
{
HANDLE hSnapshot = NULL;
//获得某一时刻系统的进程、堆(heap)、模块(module)或线程的快照信息
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot != NULL)
{
PROCESSENTRY32 processListStr;
processListStr.dwSize = sizeof(PROCESSENTRY32);
BOOL bReturnValue;
bReturnValue = Process32First(hSnapshot, &processListStr);
// DWORD dwProcessID = processListStr.th32ProcessID;
// int iThreadCnt = processListStr.cntThreads;
while (bReturnValue)
{
// AfxMessageBox(strProcessName);
// AfxMessageBox(processListStr.szExeFile);
CString szExeFile=processListStr.szExeFile;
szExeFile.MakeUpper();
if (strProcessName==szExeFile)
{
wcout<<(LPCTSTR)processListStr.szExeFile<<" id="<<processListStr.th32ProcessID<<endl;
} //获得系统进程链表中下一个进程的信息
bReturnValue = Process32Next(hSnapshot,&processListStr);
}
CloseHandle(hSnapshot);
}
}
catch (...)
{}
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
Fun_GettyProcessIDByName(TEXT("qq.exe"));
return 0;
}
// 说明: 判断进程是否运行
// 参数: [1].进程名称
// 返回值: PID.未运行则返回0
DWORD CProcess::GetProcessID( const LPCTSTR lpcszProcName )
{
HANDLE handle=::CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
PROCESSENTRY32 Info;
Info.dwSize = sizeof(PROCESSENTRY32);
if(::Process32First(handle,&Info))
{
do{
if( _tcsicmp(Info.szExeFile, lpcszProcName) == 0 )
{
::CloseHandle(handle);
return Info.th32ProcessID;
}
}
while(::Process32Next(handle,&Info));
::CloseHandle(handle);
}
return -1;
}