C++ 从线程 ID 列表中查找 GUI 线程

Cli*_*ive 4 c++ windows winapi multithreading

我正在用 C++ 构建一个应用程序,它使用 Windows 钩子来控制第三方程序。我正在制作的程序是一个教程程序,用于展示如何使用这些第三方程序。我可以找到我想要挂钩的第三方程序的进程 ID,然后我可以查询此进程 ID 以查找线程 ID 列表,以用作 Windows API 函数 SetWindowsHookEx 的参数。但是,我担心从正在运行的进程的线程 ID 列表中,我将挂接到一个可能随时完成的线程。理想情况下,我想连接到运行主 gui 的线程,这很可能是最长的线程之一(即使它不是最长的线程,教程程序也被设计为与 GUI 一起使用,所以它仍然是理想的)。

所以我的问题是从查询进程 id 得到的线程 ID 列表中,有没有办法找到主 GUI id 或另一个合适的线程,这些线程在程序退出之前将一直处于活动状态?显然,我选择的线程 ID 需要有一个事件队列,以便我可以连接到它。

Bre*_*McK 5

如何找到应用程序的主窗口,然后使用 GetWindowThreadProcessId 获取其线程 ID?

如果您还不知道主窗口,可以尝试使用 FindWindow() 查找它,如果您知道窗口名称和类名,或者使用 EnumWindows() 枚举桌面上的所有顶级窗口,并检查它们是否属于到目标进程(再次使用 GetWindowThreadProcessId,并与您的进程 ID 进行比较)。

主窗口通常是一个设置了 WS_CAPTION 样式位的窗口。还应该检查窗口是否可见(IsWindowVisible)以避免隐藏的工作窗口(通常属于工作线程)。还可以检查 WS_POPUP 和 WS_EX_TOOLWINDOW 样式以过滤掉顶级浮动窗口和对话框窗口 - 尽管它们通常归主 GUI 线程所有。

一个应用程序可以拥有任意数量的“主窗口”和 GUI 线程;通常只有一个 - 但是没有什么可以阻止开发人员创建多个线程,每个线程都有自己的主要顶级窗口和消息循环。如果您需要处理这种情况,最好的办法可能是挂钩所有显示为自己的交互式 UI 的线程。