SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,hDLLInstance,0);
是挂钩所有进程的所有线程
SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,NULL,GetCurrentThreadId());
本进程的一个线程
如何挂钩当前进程的所有线程?

解决方案 »

  1.   


    DWORD WINAPI GetMainThreadID(DWORD   dwOwnerPID)

    HANDLE   hThreadSnap   =   INVALID_HANDLE_VALUE; 
    THREADENTRY32   te32; 
    DWORD   dwThreadID   =   0; 
    hThreadSnap   =   CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,   0); 
    if   (hThreadSnap   ==   INVALID_HANDLE_VALUE) 

    return   0; 
    }  te32.dwSize   =   sizeof(THREADENTRY32); 
    if   (!Thread32First(hThreadSnap,   &te32)) 

    CloseHandle(hThreadSnap); 
    }  do 

    if   (te32.th32OwnerProcessID   ==   dwOwnerPID) 

    //返回找到的第一个线程,   不知道这个线程是否一定是主线程(WinMain所在线程) 
    dwThreadID   =   te32.th32ThreadID; 
    break; 


    while   (Thread32Next(hThreadSnap,   &te32));  CloseHandle(hThreadSnap); 
    return(dwThreadID); 

    DWORD dwThreadId = GetMainThreadID(GetCurrentProcessId());
    SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, hDLLInstance, dwThreadId);
      

  2.   

    总觉得只挂钩了一个线程,dwThreadId不明白如何定义的,如果给他的不是进程的主线程ID那会怎么样?
      

  3.   

    第3参数给本进程EXE模块句柄,第4参数给0。
      

  4.   

    dwThreadId
        [in] Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads running in the same desktop as the calling thread. 
      

  5.   

    cnzdgs,我用了您的方法,整个系统都死了,不知什么原因,
    invoke  GetModuleHandle,NULL
    invoke SetWindowsHookEx,WH_CALLWNDPROC,offset CallWndProc,eax,0
    这个HOOK 在一个DLL里,我只想对自己的进程进行HOOK。
      

  6.   

    枚举进程的线程,第一个肯定是主线程,因为从汇编代码看,枚举是从一个双向链表赋值过来的,而这个链表是创建线程时顺序插入的.EnumProcessModules枚举