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

标签 c++ windows multithreading winapi

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

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

最佳答案

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

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

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

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

关于C++ 从线程 ID 列表中查找 GUI 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6041615/

相关文章:

java - Spring用单线程池并发处理多个队列

c++ - std::atomic 错误:没有为后缀 ‘operator++(int)’ 声明 ‘++’ [-fpermissive]

c - 有没有办法通过名称获取 Windows 中当前进程的函数?

php - 使用 PHP 执行 .exe 文件

java - 如何在Java中创建多个线程?

java - Java嵌套队列

c++ - 如何访问 C++ 链表中的对象数据?

c++ - 处理带有关联字符串的枚举的正确方法

c++ - 来自 Boost.Atomic 示例的无等待队列崩溃

django - 如何在 Windows 中退出 "python manage.py runserver"