当前位置: 首页 > 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,在这种情况下,窗口会被跳过。
  • 子窗口与父窗口的关系:程序枚举所有子窗口并将它们关联到父窗口,方便在以后的操作中了解它们的关系。

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


http://www.mrgr.cn/news/14376.html

相关文章:

  • 引号的艺术:用CSS quotes 属性打造个性化引用
  • 大数据技术之 Flume概述、安装(1)
  • C++ | Leetcode C++题解之第378题有序矩阵中第K小的元素
  • Echarts的使用
  • 内容营销专家刘鑫炜:小微企业的你,为什么总做不好内容营销?
  • Pycharm can‘t open file ‘D:\\Program‘: [Errno 2] No such file or directory
  • 如何优雅的使用责任链模式?
  • 浅谈Java Spring Boot
  • 39. 数组中出现次数超过一半的数字
  • 基于 Redis 的 HyperLogLog 实现了 UV 的统计
  • 81、k8s网络配置以及k8s拉取私有仓库
  • R 2火灾温度预测
  • 2024年6月 青少年等级考试机器人实操真题二级
  • blender4.2中安装插件的方式
  • Android NDK 查看动态库的依赖关系
  • MySQL——多表操作(四)(2)带 EXISTS 关键字的子查询
  • Prometheus+exporter+Grafana
  • vulhub xxe靶机
  • 等保测评:如何有效进行安全事件响应
  • 智慧交通执法巡检检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]