本地钩不工作

时间:2012-08-29 01:34:09

标签: winapi hook setwindowshookex findwindow

我有一个应用程序并希望监视 MSWord 按键(LOCAL HOOK),但我无法弄清楚如何找到要使用的pid!下面的代码CODE通过全局挂钩(pid = 0)和(pid = GetCurrentThreadId)来实现。但不适用于GetWindowThreadProcessId

      HWND hWindow = FindWindowEx(NULL,NULL,String("Notepad").w_str(),NULL);
if (!hWindow) {
   ShowMessage("hWindow fail");
   return;
}

unsigned long pid;
GetWindowThreadProcessId(hWindow ,&pid);

//pid = GetCurrentThreadId();
if (!hWindow) {
   ShowMessage("pid fail");
   return;
}

String s = "HookDLL.dll";
DllHandle=LoadLibrary(s.w_str());
HOOKFCT_2 InstHook=reinterpret_cast<HOOKFCT_2> (GetProcAddress(DllHandle,"InstallHook"));

if(!InstHook(pid, (void *)(callIt) ))
{
    Label1->Caption="Unable to install mouse hook!";
}
else Label1->Caption="Mouse hook installed!";

对于这个问题,我会非常非常感谢...

注意:

  1. 我希望只挂机 MSWord

  2. 以上代码有效,只有在尝试挂钩其他应用时才会失效(即:不使用pid = 0pid = GetCurrentThreadId),导致= “无法安装鼠标挂钩!”

  3. 我已尝试FindWindowFindWindowExGetForegroundWindowGetActiveWindow;由于这不起作用,我相信问题是GetWindowThreadProcessId

1 个答案:

答案 0 :(得分:2)

SetWindowsHookEx需要线程ID ,而非进程ID。改为传递线程ID:

DWORD threadID = GetWindowThreadProcessId(hWindow, 0);

if(!InstHook(threadID, (void *)(callIt) )) {...}