最近公司布置了一个任务根据某个进程的消息做一些处理 我的思路是: 
1.开辟远程线程把DLL注入到目标进程 
2.在注入的DLL中开辟针对目标进程的消息钩子 现在DLL已经注入,可怎么才能让钩子知截获目标进程的消息,而不是全局的 
我把 SetWindowsHookEx的最后一个参数设为NULL也不管用,SetWindowsHookEx的最后一个参数好像也不能设置为进程ID吧 
哪位大侠提供点方法

解决方案 »

  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());
    if (dwThreadId > 0)
    {
     SetWindowsHookEx(WH_KEYBOARD, HookProc, hDLL, dwThreadId);
    }
      

  2.   

    楼主这个问题还没有解决呀.法1.
    dll已经注入到目标进程了,也就是对自己的进程安装hookHHOOK SetWindowsHookEx(
      int idHook,        // hook type
      HOOKPROC lpfn,     // hook procedure
      HINSTANCE hMod,    // 设为NULL
      DWORD dwThreadId   // 通过GetCurrentThreadId(VOID)函数获得 
    );法2.
    让dll hook的同时注入远程进程
    HHOOK SetWindowsHookEx(
      int idHook,        // hook type
      HOOKPROC lpfn,     // hook procedure
      HINSTANCE hMod,    // GetModuleHandle("dll名字")函数获得
      DWORD dwThreadId   // 可以通过 FindWindow()得到目标窗体句柄,然后GetWindowThreadProcessId()得到这个进程主线程ID
    );
      

  3.   

    只能Hook一个线程或者Hook全局,不能只Hook一个进程。一般做法是用全局Hook,然后在Hook函数中用GetWindowThreadProcessId获取消息的目的窗口所属的进程ID,如果不是自己想要Hook的进程则跳过。
      

  4.   

    说白了,我现在想截获目标进程所有窗口的WM_SETFOUCS消息
      

  5.   

    这是写外挂的基础知识
    你可以用 NULL 作为最后的参数,在 DLL 初始化的时候用 GetModuleHandle 检查是否是你需要入侵的进程,当然其他的进程函数或模块函数也可以