当前位置: 首页 > news >正文

【QT】学习笔记:枚举桌面窗口句柄

在 Qt 中,虽然 Qt 本身没有直接提供枚举桌面窗口的 API,但可以通过调用 Windows API 来实现枚举桌面上所有窗口的句柄,包括子窗口以及子窗口与父窗口的关系。我们可以使用 Windows 的 EnumWindowsEnumChildWindows 函数来枚举所有顶层窗口及其子窗口。

以下是一个完整的 Qt 程序示例,它演示了如何枚举所有顶层窗口和它们的子窗口,并显示它们之间的父子关系。

示例代码

#include <QCoreApplication>
#include <Windows.h>
#include <QDebug>
#include <QMap>
#include <QString>// 用于存储父窗口及其子窗口关系
QMap<HWND, QList<HWND>> windowHierarchy;// 枚举子窗口的回调函数
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) {HWND parent = (HWND)lParam;windowHierarchy[parent].append(hwnd);return TRUE;
}// 枚举顶层窗口的回调函数
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) {// 获取窗口标题int length = GetWindowTextLength(hwnd);if (length > 0) {TCHAR *buffer = new TCHAR[length + 1];GetWindowText(hwnd, buffer, length + 1);QString windowTitle = QString::fromWCharArray(buffer);delete[] buffer;qDebug() << "Top-level Window Handle:" << hwnd << "Title:" << windowTitle;// 枚举子窗口EnumChildWindows(hwnd, EnumChildProc, (LPARAM)hwnd);}return TRUE;
}int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 枚举所有顶层窗口EnumWindows(EnumWindowsProc, 0);// 输出子窗口的父子关系for (auto it = windowHierarchy.begin(); it != windowHierarchy.end(); ++it) {HWND parent = it.key();const QList<HWND>& children = it.value();qDebug() << "Parent Window Handle:" << parent << "has" << children.size() << "children.";for (HWND child : children) {qDebug() << "    Child Window Handle:" << child;}}return a.exec();
}

代码说明

  1. Windows API 函数

    • EnumWindows: 枚举所有顶层窗口。
    • EnumChildWindows: 枚举指定窗口的子窗口。
    • GetWindowText: 获取窗口的标题文本。
  2. 数据结构

    • 使用 QMap<HWND, QList<HWND>> 来存储窗口的父子关系,键是父窗口句柄,值是子窗口句柄的列表。
  3. 回调函数

    • EnumWindowsProc: 枚举顶层窗口的回调函数,它会获取窗口的标题并调用 EnumChildWindows 来枚举该窗口的所有子窗口。
    • EnumChildProc: 枚举子窗口的回调函数,它将子窗口添加到对应父窗口的列表中。
  4. 主函数

    • EnumWindows(EnumWindowsProc, 0); 枚举所有顶层窗口,并为每个顶层窗口调用回调函数 EnumWindowsProc
    • 最后,遍历 windowHierarchy,输出每个顶层窗口及其子窗口的关系。

运行结果

程序将在控制台输出所有顶层窗口及其子窗口的句柄和标题,例如:

Top-level Window Handle: 0x000203D2 Title: "MyApp - Notepad"
Parent Window Handle: 0x000203D2 has 3 children.Child Window Handle: 0x000203DAChild Window Handle: 0x000203E2Child Window Handle: 0x000203EA
...

注意事项

  • Windows 特定:这个代码依赖 Windows API,因此只能在 Windows 系统上运行。
  • 窗口标题为空:某些窗口可能没有标题,因此 GetWindowTextLength 返回 0,在这种情况下,窗口会被跳过。
  • 子窗口与父窗口的关系:程序枚举所有子窗口并将它们关联到父窗口,方便在以后的操作中了解它们的关系。

这个示例提供了一个基础框架,你可以在此基础上扩展功能,例如进一步获取窗口的其他属性,或执行更复杂的窗口管理操作。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Kafka【三】Windows下安装Kafka集群
  • 使用VM创建centos7环境
  • 淘宝扭蛋机小程序开发,吸引更多的消费者
  • 海外媒体发布:12个旅游业发展媒体宣发对策,给你提升曝光量
  • 解决el-table中使用el-input无法聚焦问题
  • 加速产品研发:项目管理软件与团队的协同之道
  • easy_fastapi Python 后端开发框架
  • Python 与 Excel 图表自动化:让数据“会说话”
  • 使用Qdrant + CNCLIP + Gradio 实现图文检索
  • SprinBoot+Vue图书馆预约与占座微信小程序的设计与实现
  • CISAW认证培训的方向包括多少种?
  • GNN会议期刊汇总(人工智能、机器学习、深度学习、数据挖掘)
  • 基于STM32的猫狗宠物喂养系统设计(微信小程序)(215)
  • 电脑图片只显示图标不显示图片,但是可以打开看,就是不能预览
  • 【课程学习】信号检测与估计
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【comparator, comparable】小总结
  • 【mysql】环境安装、服务启动、密码设置
  • 08.Android之View事件问题
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • es6--symbol
  • es6要点
  • Koa2 之文件上传下载
  • MaxCompute访问TableStore(OTS) 数据
  • SAP云平台里Global Account和Sub Account的关系
  • Vue.js-Day01
  • vue2.0项目引入element-ui
  • 关于使用markdown的方法(引自CSDN教程)
  • 理解在java “”i=i++;”所发生的事情
  • 力扣(LeetCode)357
  • 浏览器缓存机制分析
  • 正则表达式小结
  • const的用法,特别是用在函数前面与后面的区别
  • mysql面试题分组并合并列
  • Semaphore
  • # Panda3d 碰撞检测系统介绍
  • #Z0458. 树的中心2
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (区间dp) (经典例题) 石子合并
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)大道至简,职场上做人做事做管理
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .Net中的设计模式——Factory Method模式
  • @Controller和@RestController的区别?
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @在php中起什么作用?
  • [Android]常见的数据传递方式
  • [C#]winform部署官方yolov10目标检测的onnx模型