我想给应用程序添加一个钩子。 我正在使用SetWindowsHookEx
,我可以创build一个系统范围的钩子,但我想为特定的应用程序创build一个钩子。 我需要有目标应用程序的线程ID挂钩它。 我知道窗口的标题,我知道EXE的名称,从这些我可以得到窗口句柄和进程ID,但我怎么得到线程ID? 我看到一篇关于如何在c#中完成的文章 ,但是我不明白如何获得c ++中的线程列表。
HWND windowHandle = FindWindow(NULL, _T("SomeOtherApp")); DWORD processId = GetWindowThreadProcessId(windowHandle, NULL); DWORD threadId = ??? // How do I get thread id here? HHOOK hook = ::SetWindowsHookEx( WH_CBT, HookCBTProc, hInst, threadId);
谢谢,亚历山大。
GetWindowThreadProcessId()
返回线程ID。 您错误地将线程ID分配给进程ID变量。 相反写:
HWND windowHandle = FindWindow(NULL, _T("SomeOtherApp")); DWORD threadId = GetWindowThreadProcessId(windowHandle, NULL); HHOOK hook = ::SetWindowsHookEx(WH_CBT, HookCBTProc, hInst, threadId);
答案是GetWindowThreadProcessId
。 它需要窗口句柄并返回创建该窗口的线程的ID和可选的进程ID。