13,825
社区成员
发帖
与我相关
我的任务
分享
DWORD GetThreadID(HANDLE hThread,DWORD dwProcessId)
{
HANDLE hThreadSnap=INVALID_HANDLE_VALUE;
THREADENTRY32 te32;
#ifdef __GNUC__
typedef HANDLE (*OPENTHREAD)(DWORD,BOOL,DWORD);
OPENTHREAD OpenThread=::GetProcAddress(::GetModuleHandle("kernel32.dll"),"OpenThread");
#endif
hThreadSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0);//获取进程列表快照
if(hThreadSnap==INVALID_HANDLE_VALUE){
return -1;
}
te32.dwSize = sizeof(THREADENTRY32);
if(::Thread32First(hThreadSnap,&te32)==FALSE){
return 1;
}
while(::Thread32Next(hThreadSnap,&te32)!=FALSE){//如果获取下一个线程成功
if(te32.th32OwnerProcessID==dwProcessId){//如果获取的进程ID与指定的进程ID相同
HANDLE hTempThread=OpenThread(THREAD_ALL_ACCESS,FALSE,te32.th32ThreadID);//根据结构体内的线程ID,打开线程得到句柄
if(hTempThread==hThread){//如果指定线程句柄与打开句柄相同
//问题出在这里,我有2台4核电脑,一台双核,一台单核;单核机和双核机运行正常,两台四核电脑上运行找不到相同的句柄
//一台四核装的win7,其他3台电脑装的都是完全相同的XP系统,在四核电脑上跟踪调试hTempThread都是3-4位数的句柄,
//hThread都是5位数的句柄,为什么会这样呢?该怎么修改啊?
::CloseHandle(hTempThread);
::CloseHandle(hThreadSnap);
return te32.th32ThreadID;//返回句柄
}else{
::CloseHandle(hTempThread);
}
}
}
return 0;
}
HWND hwndHandle = FindWindow("TForm_Client","辅助工具");
if(hwndHandle)
{
unsigned long PID;
GetWindowThreadProcessId(hwndHandle,&PID);
HWND hdwWnd = FindWindowEx(hwndHandle, NULL,"TPageControl",NULL);
hdwWnd = FindWindowEx(hdwWnd, NULL,"TTabSheet","登录");
hdwWnd = FindWindowEx(hdwWnd, NULL,"TButton","登录.L");
PID=GetThreadID(hdwWnd,PID);
……
}