我正在用C ++构建一个应用程序,它使用Windows钩子来控制第三方程序。我正在制作的程序是一个教程程序,用于演示如何使用这些第三方程序。我可以找到要挂钩的第三方程序的进程ID,然后我可以查询此进程ID以查找用作Windows API函数SetWindowsHookEx的参数的线程ID列表。但是我担心从运行进程的线程ID列表中我将挂钩到一个可能随时可能完成的线程。理想情况下,我想挂钩运行主gui的线程,这很可能是最长的生命线程之一(即使它不是最长的生命线程,教程程序设计用于GUI,所以它仍然是理想的)。如果第三方应用程序有多个gui,那么我想找到主GUI的线程ID。
所以我的问题来自我从查询进程ID获得的线程ID列表是否有办法找到主GUI ID或其他合适的线程,它将在程序退出之前处于活动状态?显然,我选择的线程ID需要有一个事件队列,所以我可以挂钩它。
答案 0 :(得分:3)
如何找到应用程序的主窗口,然后使用GetWindowThreadProcessId获取该线程的ID?
如果您还不知道主窗口,可以尝试使用FindWindow()查找它(如果您知道窗口名称和类名),或者EnumWindows()来枚举桌面上的所有顶级窗口,并检查如果它们属于目标进程(再次使用GetWindowThreadProcessId,并与您的进程ID进行比较)。
主窗口通常是一个设置了WS_CAPTION样式位的窗口。还应该检查窗口是否可见(IsWindowVisible)以避免隐藏的工作窗口(通常属于工作线程)。还可以检查WS_POPUP和WS_EX_TOOLWINDOW样式以过滤掉顶级浮动和对话框窗口 - 尽管它们通常归主GUI线程所有。
应用程序可以拥有任意数量的“主窗口”和GUI线程;通常只有一个 - 但没有什么可以阻止开发人员创建多个线程,每个线程都有自己的主顶级窗口和消息循环。如果你需要处理这种情况,你最好的办法就是挂钩看似拥有交互式UI的所有线程。
答案 1 :(得分:1)