请问高手怎样为某一进程的所有线程安装钩子?请赐教! 现在我得到了一个进程ID,开始我用SetWindowsHookEx(),将函数的最后参数设为进程ID号,但钩子没有成功启动,只能将钩子注入到线程中,但我只想关注某一进程的消息,也就是想为某一进程中的所有线程安装钩子,请问高手有何高见,请赐教! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Please try to use EnumThreadWindows 我写的代码,已知一进程ID,我想获得该进程中的所以的线程ID,代码如下,但有错误。HANDLE hThreadSnap=NULL;THREADENTRY32 me32={0};me32.dwSize=sizeof(THREADENTRY32);hThreadSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId); //已知进程IDif(Thread32First(hThreadSnap,&me32)) { do { CString str1; str1.Format("找到线程,ID:%d",me32.th32ThreadID); AfxMessageBox(str1); } while(Thread32Next(hThreadSnap,&me32)); } else { AfxMessageBox("没有找到任何线程");} CloseHandle(hThreadSnap); // 关掉线程快照 下面是我写的代码,用于获得当前进程的主线程ID,如果你想继续枚举其它线程,在此基础上改动一下满足你的需要就可以了。据我的理解,好像这列举出来的线程是所有进行的线程是链在一起的,所以不判断进程ID的话,就无法保证获得的线程是当前进程的线程。//获得当前进程的主线程IDBOOL GetCurrentMainThreadID(DWORD &dwThreadID){ HANDLE hThreadSnap = INVALID_HANDLE_VALUE; BOOL bRet = FALSE; THREADENTRY32 te32 = {0}; DWORD dwProcessId = 0; dwProcessId = GetCurrentProcessId(); // Take a snapshot of all processes in the system. hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); if (hThreadSnap == INVALID_HANDLE_VALUE) { return FALSE; } // Fill in the size of the structure before using it. te32.dwSize = sizeof(THREADENTRY32); if (Thread32First(hThreadSnap, &te32)) { if (te32.th32OwnerProcessID == dwProcessId) { dwThreadID = te32.th32ThreadID; bRet = TRUE; } } while (!bRet && Thread32Next(hThreadSnap, &te32)) { if (te32.th32OwnerProcessID == dwProcessId) { dwThreadID = te32.th32ThreadID; bRet = TRUE; } } // Do not forget to clean up the snapshot object. CloseHandle (hThreadSnap); return bRet; } vc++网络系统开发用多线程还是单线程? 一个单视图的问题 用 CDialog t; t.Domodal()显示一个modal对话框,我现在需要当这个对话框在屏幕上显示完后,我想把这个Dialog用拷屏的方法截下来,问题是 关于ComboBox的一个 问题~ 很困惑~~ 读取文件,并发现其中的特殊字符串? 菜单状态及时更新的问题 请问怎么取得鼠标指针指的那个位置上的颜色啊? 如果使窗口移动的时候显示窗口内容? 关于消息发送 如果知道当前读取的进度?[数据库] 如何使用别人写的一个能生成动态链接库的文件? 怎么样取得当前运行程序所在的路径
THREADENTRY32 me32={0};
me32.dwSize=sizeof(THREADENTRY32);
hThreadSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId); //已知进程ID
if(Thread32First(hThreadSnap,&me32))
{
do
{
CString str1;
str1.Format("找到线程,ID:%d",me32.th32ThreadID);
AfxMessageBox(str1);
}
while(Thread32Next(hThreadSnap,&me32));
}
else
{
AfxMessageBox("没有找到任何线程");
}
CloseHandle(hThreadSnap); // 关掉线程快照
BOOL GetCurrentMainThreadID(DWORD &dwThreadID)
{
HANDLE hThreadSnap = INVALID_HANDLE_VALUE;
BOOL bRet = FALSE;
THREADENTRY32 te32 = {0};
DWORD dwProcessId = 0; dwProcessId = GetCurrentProcessId();
// Take a snapshot of all processes in the system.
hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hThreadSnap == INVALID_HANDLE_VALUE)
{
return FALSE;
}
// Fill in the size of the structure before using it.
te32.dwSize = sizeof(THREADENTRY32);
if (Thread32First(hThreadSnap, &te32))
{
if (te32.th32OwnerProcessID == dwProcessId)
{
dwThreadID = te32.th32ThreadID;
bRet = TRUE;
}
} while (!bRet && Thread32Next(hThreadSnap, &te32))
{
if (te32.th32OwnerProcessID == dwProcessId)
{
dwThreadID = te32.th32ThreadID;
bRet = TRUE;
}
}
// Do not forget to clean up the snapshot object.
CloseHandle (hThreadSnap);
return bRet;
}