妖哥,各位高手,进来帮忙看看,谢谢了!

shLeon 2012-05-10 03:40:53
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);
……


...全文
108 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shLeon 2012-05-16
  • 打赏
  • 举报
回复
if(hTempThread==hThread){//如果指定线程句柄与打开句柄相同
我把这里去掉了,钩子也能正常装上,不去弄了,可能不是很重要。
昨天我又调试了一下,双核电脑也不是100%能够找到相同句柄的。
ccrun.com 2012-05-13
  • 打赏
  • 举报
回复
不曾注意过双核或4核CPU的区别,至于枚举进程这里,楼主你试试EnumProcess
shLeon 2012-05-11
  • 打赏
  • 举报
回复
……无解吗?

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧