1

私はアプリケーションを持っていて、MSWord のキープレス (LOCAL HOOK) を監視したいのですが、使用する pid を見つける方法がわかりません! 以下の CODE WORKS GOOD は、グローバル フック ( 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=0またはpid=を使用しない場合GetCurrentThreadId) にのみ失敗し、結果として = "マウス フックをインストールできません!" が発生します。.

  3. 私はすでに試してFindWindowいますFindWindowEx、、、; これはうまくいかないので、問題は.GetForegroundWindowGetActiveWindowGetWindowThreadProcessId

4

1 に答える 1

2

SetWindowsHookExプロセス ID ではなく、スレッド IDが必要です。代わりにスレッド ID を渡します。

DWORD threadID = GetWindowThreadProcessId(hWindow, 0);

if(!InstHook(threadID, (void *)(callIt) )) {...}
于 2012-08-29T12:37:41.110 に答える