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