【问题标题】:C++ finding the GUI thread from a list of thread IDsC++ 从线程 ID 列表中查找 GUI 线程
【发布时间】:2011-08-27 20:24:04
【问题描述】:

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

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

【问题讨论】:

    标签: c++ windows multithreading winapi


    【解决方案1】:

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

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

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

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

    【讨论】:

    【解决方案2】:

    判断一个线程是否为GUI线程最简单、最可靠的方法是调用GetGUIThreadInfo

    如果指定线程没有 [...] 输入队列,则函数将失败。

    除其他外,拥有一个输入队列将 GUI 线程与常规线程区分开来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多