现在我得到了一个进程ID,开始我用SetWindowsHookEx(),将函数的最后参数设为进程ID号,但钩子没有成功启动,只能将钩子注入到线程中,但我只想关注某一进程的消息,也就是想为某一进程中的所有线程安装钩子,请问高手有何高见,请赐教!

解决方案 »

  1.   

    Please try to use EnumThreadWindows
      

  2.   

    我写的代码,已知一进程ID,我想获得该进程中的所以的线程ID,代码如下,但有错误。HANDLE hThreadSnap=NULL;
    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);  //   关掉线程快照
      

  3.   

    下面是我写的代码,用于获得当前进程的主线程ID,如果你想继续枚举其它线程,在此基础上改动一下满足你的需要就可以了。据我的理解,好像这列举出来的线程是所有进行的线程是链在一起的,所以不判断进程ID的话,就无法保证获得的线程是当前进程的线程。//获得当前进程的主线程ID
    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; 
    }