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

【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: 0x000203DA
    Child Window Handle: 0x000203E2
    Child Window Handle: 0x000203EA
...

注意事项

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

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


http://www.kler.cn/a/289957.html

相关文章:

  • 代码随想录第二十一天| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树
  • Django基础用法+Demo演示
  • 解决Anaconda出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url
  • 继承和多态(上)
  • NoSQL数据库与关系型数据库的主要区别
  • AI 写作(五)核心技术之文本摘要:分类与应用(5/10)
  • 代码随想录算法训练营第35天|背包问题基础、46. 携带研究材料(01背包二维解法)(01背包一维解法)(acm)、416. 分割等和子集
  • 解决Vue npm 淘宝镜像证书过期问题
  • Blazor项目中建立WebApi
  • C++使用MyStack和MyQueue封装栈和队列
  • Chrome 浏览器插件获取网页 window 对象(方案一)
  • pip切换清华源
  • 数据结构二叉树——堆
  • Scott Brinker:Martech中的AI会让买家体验更好还是更糟?这取决于…….
  • Unity版本升级2022 Gradle 升级7.x版本调整
  • 代码随想录 刷题记录-27 图论 (4)拓扑排序
  • Rides实现分布式锁,保障数据一致性,Redisson分布式事务处理
  • python学习之路 - PySpark快速入门
  • docker实战基础三(Docker基础命令)
  • lvgl 自定义组件介绍二
  • yolo训练策略--使用 Python 和 OpenCV 进行图像亮度增强与批量文件复制之(图像增强是按梯度变化优化)
  • 光盘安全隔离与信息单向导入系统-信刻
  • 以人口金字塔图为例,在线绘制左右双侧堆叠条形图
  • 如何设计店铺租赁租凭平台?Java SpringBoot实现全攻略
  • 后端是否开启异步执行,看打印日志的线程信息
  • 多线程篇(可见性 原子性 有序性(原子性))(持续更新迭代)