HHOOK SetWindowsHookEx(
  int idHook,        // hook type
  HOOKPROC lpfn,     // hook procedure
  HINSTANCE hMod,    // handle to application instance
  DWORD dwThreadId   // thread identifier
)
中dwThreadId说明是:与钩子函数关联的线程ID,可是这个ID怎么得到哪?我用GetWindowThreadProcessId的返回值和第二个OUT参数都试了试,得不到正确的结果,我的代码如下:
_declspec (dllexport) void SetHook()
{
HWND hStart = ::FindWindow (NULL,"计算器");
//获得目标进程句柄
DWORD TID,PID;
TID = ::GetWindowThreadProcessId (hStart, &PID);

g_hKey=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,g_hInst,PID);  //这里用PID和TID都不对,用NULL可以对所有线程设钩子
//g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,g_hInst,0);
}
请问高手,怎么向一个指定窗口下钩子,比如“计算器”窗口?

解决方案 »

  1.   

    将HOOK放在Dll中去,实现一个全局HOOK,然后钩住消息之后,判断Message的HWND是否与“计算器”的相同。
      

  2.   

    我没说清楚,HOOK是在DLL里放的,你说的办法还是做个全局的钩子,这样每个进程都要加载dll,我现在就是不想每个进程加载dll
    “g_hKey=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,g_hInst,PID);  //这里用PID和TID都不对,用NULL可以对所有线程设钩子 ”我现在钩子已经能用了,看这个注释“用NULL可以对所有线程设钩子”
      

  3.   

    其实简单的说,就是知道一个窗口的HWND,怎么给这个进程加一个专用的钩子?
      

  4.   

    DWORD dwThreadID = 0;
    GetWindowThreadProcessId(hWnd, &dwThreadID);
      

  5.   

    全局的钩子自然会钩住所有的消息啊,从而取得消息对应的HWND.
    另外你在通过FindWindow找到“计算器”对应的HWND,
    对比两个HWND,你就可以知道你当前钩住的消息是不是“计算器”的了.