C ++挂钩到不同的应用程序,如何从进程IDfind线程ID?

我想给应用程序添加一个钩子。 我正在使用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。