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

news2024/9/20 1:12:47

在 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.coloradmin.cn/o/2104006.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言指针进阶三:(回调函数,qsort函数的模拟)

回调函数 回调函数就是通过函数指针调用的函数&#xff0c;如果你把函数的指针作为参数传递给另一个函数&#xff0c;当这个指针被用来调用其指向的函数时&#xff0c;我们所说这就是回调函数。 qsort函数的使用&#xff08;回调函数案例&#xff09; 我们先看看qsort函数的…

【单调栈 】2289. 使数组按非递减顺序排列

本文涉及的基础知识点 单调栈分类、封装和总结 LeetCode2289. 使数组按非递减顺序排列 给你一个下标从 0 开始的整数数组 nums 。在一步操作中&#xff0c;移除所有满足 nums[i - 1] > nums[i] 的 nums[i] &#xff0c;其中 0 < i < nums.length 。 重复执行步骤&a…

【重磅推荐】《一本书读懂大模型:技术创新、商业应用与产业变革》发布!大模型零基础入门到精通

近日&#xff0c;由中国电信研究院天翼智库大模型研究团队编写、中国电信集团科技委主任邵广禄倾情作序的**《一本书读懂大模型&#xff1a;技术创新、商业应用与产业变革》**正式出版。本书系统介绍了大模型技术的发展历程、核心技术、行业应用、产业体系、治理问题以及未来展…

DeFi 发展的岔路口,Pencils Protocol带领投资者们“向前看”

DeFi 市场是否还存在 Alpha 机会&#xff1f; 走下坡路的 DeFi 去中心化金融&#xff08;DeFi&#xff09;曾是区块链世界发展的起点&#xff0c;也是链上世界流动性的重要支柱。然而&#xff0c;自 2021 年 DeFi 领域的总锁仓量&#xff08;TVL&#xff09;达到历史巅峰——…

模型压缩之剪枝

&#xff08;1&#xff09;通道选择 这里要先解释一下&#xff1a; &#xff08;1&#xff09;通道剪枝 那我们实际做法不是上面直接对所有层都添加L1正则项&#xff0c;而是仅仅对BN层权重添加L1正则项。通道剪枝具体步骤如下&#xff1a; 1.BN层权重添加L1正则项&#xf…

ElementUI实现el-table组件的合并行功能

前言 有时遇到一些需求&#xff0c;需要实现ElementUI中&#xff0c;el-tabled组件合并单元格的功能&#xff0c;稍微了解一下它的数据格式&#xff0c;不难可以写出比合并方法。但是在鼠标经过单元行时&#xff0c;会出现高亮的行与鼠标经过的行不一致的BUG。因此还需要实现c…

超级右键 - 为 Mac 的右键菜单升级一下

是不是有很多小伙伴&#xff0c;希望 Mac 也能像 Windows 一样&#xff0c;拥有丰富的右键菜单&#xff0c;快速完成新建、剪切、发送文件等操作。 一个叫作超级右键的工具就能做到&#xff0c;它能为 Mac 右键菜单增添多个功能选项&#xff0c;如 Win 系统般一键新建 / 剪切文…

vue通过html2canvas+jspdf生成PDF问题全解(水印,分页,截断,多页,黑屏,空白,附源码)

前端导出PDF的方法不多&#xff0c;常见的就是利用canvas画布渲染&#xff0c;再结合jspdf导出PDF文件&#xff0c;代码也不复杂&#xff0c;网上的代码基本都可以拿来即用。 如果不是特别追求完美的情况下&#xff0c;或者导出PDF内容单页的话&#xff0c;那么基本上也就满足业…

我的大模型岗位面试总结!太卷了!!!—我面试了24家大模型岗位 只拿了9个offer!

这段时间面试了很多家&#xff08;共24家&#xff0c;9个offer&#xff0c;简历拒了4家&#xff0c;剩下是面试后拒的&#xff09;&#xff0c;也学到了超级多东西。 大模型这方向真的卷&#xff0c;面试时好多新模型&#xff0c;新paper疯狂出&#xff0c;东西出的比我读的快…

传统CV算法——基于opencv的答题卡识别判卷系统

基于OpenCV的答题卡识别系统&#xff0c;其主要功能是自动读取并评分答题卡上的选择题答案。系统通过图像处理和计算机视觉技术&#xff0c;自动化地完成了从读取图像到输出成绩的整个流程。下面是该系统的主要步骤和实现细节的概述&#xff1a; 1. 导入必要的库 系统首先导入…

误删的PPT怎么恢复回来?

在日常工作和学习中&#xff0c;PPT已成为我们不可或缺的工具。然而&#xff0c;有时不小心误删重要的PPT文件&#xff0c;可能会让人倍感焦虑。别担心&#xff0c;本文将为你提供几种实用的方法&#xff0c;帮助你轻松恢复误删的PPT文件。 一、从回收站恢复 当你误删文件时&…

【Grafana】Prometheus结合Grafana打造智能监控可视化平台

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

香港一带一路研究院国际事务研究中心副主任陈景才阐述香港在一带一路建设及区块链金融领域的关键作用

2024年8月28日&#xff0c;香港金管局举行Ensemble项目沙盒&#xff08;以下简称沙盒&#xff09;启动仪式&#xff0c;并宣布首阶段试验将涵盖四大代币化资产用例主题&#xff0c;标志着金融业在代币化技术的实际应用进程中迈出重要一步。香港一带一路研究院国际事务研究中心副…

解剖学上合理的分割:通过先验变形显式保持拓扑结构|文献速递--基于深度学习的医学影像病灶分割

Title 题目 Anatomically plausible segmentations: Explicitly preserving topology through prior deformations 解剖学上合理的分割&#xff1a;通过先验变形显式保持拓扑结构 01 文献速递介绍 进行环向应变或壁厚度的计算&#xff0c;这些测量通常用于诊断肥厚性心肌病…

IDEA 安装lombok插件不兼容的问题及解决方法

解决&#xff1a;IDEA 安装lombok插件不兼容问题&#xff0c;plugin xxxx is incompatible 一、去官网下载最新的2024版本 地址传送通道&#xff1a; lombok插件官网地址https://plugins.jetbrains.com/plugin/6317-lombok/versions/stable 二、修改参数的配置 在压缩包路径…

理解C++的【内部链接】和【外部链接】

一、前言 最近在看《大规模C程序设计》一书&#xff0c;看第一章关于内部链接和外部链接这部分时&#xff0c;有点不太明白。通过书本理解和网上查阅文献&#xff0c;在此记录一下自己对这部分知识点的理解。 首先&#xff0c;提几个问题&#xff1a; 什么是内部链接&#x…

全域运营公司哪家做得好?全域运营系统综合评测结果揭晓!

作为当前火爆的风口项目&#xff0c;一直以来&#xff0c;全域运营都以其广阔的业务范围和巨大的收益潜力吸引着一批又一批的创业者入局分羹&#xff0c;使得全域运营公司哪家做得好等问题一度成为了相关创业者交流群内的讨论重点。 从目前的市场情况来看&#xff0c;由于进入…

定期加强医疗器械维修技能学习重要性

医学影像技术是现代医疗的重要支撑,是辅助临床诊断和治疗不可或缺的技术手段。影像医疗设备成像质量的优劣程度在一定程度上决定了疾病诊断结果的准确性,而术中使用的影像设备的优劣甚至可能影响手术的成功率。因此保证设备正常使用是重中之重&#xff0c;设备售后维修保养也就…

Langchain-Chatchat+Qwen实现本地知识库

1.基础介绍 Langchain-Chatchat一种利用 langchain 思想实现的基于本地知识库的问答应用&#xff0c;目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。大致过程包括加载文件 -> 读取文本 -> 文本分割 -> 文本向量化 -> 问句向量化…

《OpenCV计算机视觉》—— 对图片的各种操作

文章目录 1、安装OpenCV库2、读取、显示、查看图片3、对图片进行切割4、改变图像的大小5、图片打码6、图片组合7、图像运算8、图像加权运算 1、安装OpenCV库 使用pip是最简单、最快捷的安装方式 pip install opencv-python3.4.2还需要安装一个包含了其他一些图像处理算法函数的…