qt 当前窗口句柄_QT获取Windows系统所有窗口句柄

#include

#include

#pragma comment(lib,"user32.lib")

/* 回调函数,用于捕获进程 */

BOOL MyEnumProc(HWND hwnd, LPARAM param)

{

LPWSTR lpString = (LPWSTR)malloc(sizeof(WCHAR) * MAX_PATH);

if (IsWindow(hwnd) &&

IsWindowEnabled(hwnd) &&

IsWindowVisible(hwnd))

{

if (GetWindowTextW(hwnd, lpString, MAX_PATH) > 0) {

qDebug() << QString::fromStdWString(lpString); // 打印出有标题的窗口

}

}

free(lpString);

return TRUE;

}

int main(int argc, char *argv[])

{

/* 枚举窗口的所有进程 */

EnumWindows(MyEnumProc, 0);

return 0;

}

句柄详解,什么是句柄?句柄有什么用?

这里需要说明:

1.这里将句柄所能标识的所有东西(如窗口、文件、画笔等)统称为“对象”。

2.图中一个小横框表示一定大小的内存区域,并不代表一个字节,如标有0X00000AC6的横框表示4个字节。

3.图解的目的是为了直观易懂,所以不一定与源码完全对应,会有一定的简化。

让我们先看图,再解释。

其中,图1是程序运行到某时刻时的内存快照,图2是程序往后运行到另一时刻时的内存快照。红色部分标出了两次的变化。

简单解释:

Windows是一个以虚拟内存为基础的操作系统,很多时候,进程的代码和数据并不全部装入内存,进程的某一段装入内存后,还可能被换出到外存,当再次需要时,再装入内存。两次装入的地址绝大多数情况下是不一样的。也就是说,同一对象在内存中的地址会变化。(对于虚拟内存不是很了解的读者,可以参考有关操作系统方面的书籍)那么,程序怎么才能准确地访问到对象呢?为了解决这个问题,Windows引入了句柄。

系统为每个进程在内存中分配一定的区域,用来存放各个句柄,即一个个32位无符号整型值(32位操作系统中)。每个32位无符号整型值相当于一个指针,指向内存中的另一个区域(我们不妨称之为区域A)。而区域A中存放的正是对象在内存中的地址。当对象在内存中的位置发生变化时,区域A的值被更新,变为当前时刻对象在内存中的地址,而在这个过程中,区域A的位置以及对应句柄的值是不发生变化的。这种机制,用一种形象的说法可以表述为:有一个固定的地址(句柄),指向一个固定的位置(区域A),而区域A中的值可以动态地变化,它时刻记录着当前时刻对象在内存中的地址。这样,无论对象的位置在内存中如何变化,只要我们掌握了句柄的值,就可以找到区域A,进而找到该对象。而句柄的值在程序本次运行期间是绝对不变的,我们(即系统)当然可以掌握它。这就是以不变应万变,按图索骥,顺藤摸瓜。

所以,我们可以这样理解Windows句柄:

数值上,是一个32位无符号整型值(32位系统下);逻辑上,相当于指针的指针;形象理解上,是Windows中各个对象的一个唯一的、固定不变的ID;作用上,Windows使用句柄来标识诸如窗口、位图、画笔等对象,并通过句柄找到这些对象。

下面,关于句柄,再交代一些关键性细节:

1.所谓“唯一”、“不变”是指在程序的一次运行中。如果本次运行完,关闭程序,再次启动程序运行,那么这次运行中,同一对象的句柄的值和上次运行时比较,一般是不一样的。

其实这理解起来也很自然,所谓“一把归一把,这把是这把,那把是那把,两者不相干”(“把”是形象的说法,就像打牌一样,这里指程序的一次运行)。

2.句柄是对象生成时系统指定的,属性是只读的,程序员不能修改句柄。

3.不同的系统中,句柄的大小(字节数)是不同的,可以使用sizeof()来计算句柄的大小。

4.通过句柄,程序员只能调用系统提供的服务(即API调用),不能像使用指针那样,做其它的事。

写在后面:

到此为止,有关Windows句柄就简单介绍到这里。需要说明的是,本文是面向初学者的,旨在让读者对句柄有一个完整而清晰的认知,既要避免知其然而不知其所以然的茫然困惑,又要避免深入源码的艰难晦涩。因此,本文并不能做到绝对的直达本质,同时也可能在个别细节上与真实情况稍有出入,但在下认为这并不贻害初学者对句柄的认识。因为对某一知识的认知,从几乎一无所知或是一知半解到“精通”,往往需要更多新知识的补充,短时间内很难达到,在不影响知识的使用的前提下,先把握整体,在逐步深入细节,不失为一个明智的选择。想进一步深入理解Windows句柄的读者,可以看在下的下一篇文章《源码剖析——深入Windows句柄本质》。

作者:

喜欢围棋和编程。查看的所有文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501110.shtml

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

相关文章

JdbcTemplate(操作数据库-查询返回对象、查询返回集合)

JdbcTemplate&#xff08;操作数据库-查询返回对象、查询返回集合&#xff09; 1.创建数据库 数据库中有三条记录&#xff0c;数据库名为user_db&#xff0c;数据库表为t_book 2.新建实体类&#xff1a; Book类中的每一个属性对应数据库中的一条记录 package org.example.sp…

hbase 查询设置超时_hbase master挂掉-zookeeper连接超时原因

并行运行hbase删表&#xff0c;建表操作&#xff0c;多个表多个region&#xff0c;导致hbase挂掉。查看日志&#xff1a;从日志中可以看出GC时间过长导致zookeeper连接超时&#xff0c;master退出。(是master退出而不是regionserver退出是因为进行的操作是建表&#xff0c;删表…

机器学习如何计算特征的重要性_机器学习之特征工程

特征选择是特征工程中的一个子集&#xff0c;从所有的特征中&#xff0c;选择有意义的&#xff0c;对模型有帮助的特征&#xff0c;以避免将所有特征中对模型没作用的特征导入模型去训练&#xff0c;消耗不必要的计算资源。更正式地说&#xff0c;给定n个特征&#xff0c;我们搜…

白中英 计算机组成原理_计算机组成原理 第五版.立体化教材 白中英 大学教材...

目 录第1章 计算机系统概论第2章 运算方法和运算器第3章 多层次的存储器第4章 指令系统第5章 中央处理器第6章 总线系统第7章 外存与IO设备第8章 输入输出系统第9章 并行组织与结构关于我们大学生必备资源库为大学生提供网课答案、大学课后答案、软件安装、大学考试考证资源以及…

Spring事务操作-事务

目录 Spring事务操作-事务 1.什么是事务 &#xff08;1&#xff09;典型场景 2.事务的四个特性&#xff08;俗称ACID特性&#xff09; &#xff08;1&#xff09;原子性 &#xff08;2&#xff09;一致性 &#xff08;3&#xff09;隔离性 &#xff08;4&#xff09;持久性…

ios 静态库合成_iOS : 静态库(.framework)合并

如果写了一个Framework&#xff0c;根据Build时选择的机器类型&#xff0c;会分为模拟器Framework和真机Framework&#xff0c;两者是不能混用的。此时可以通过配置一个Run Script&#xff0c;在Script中使用lipo命令来合并两个版本的Framework&#xff0c;重新生成一个新的Fra…

python在统计专业的应用_Python:使用Counter进行计数统计

计数统计就是统计某一项出现的次数。实际应用中很多需求需要用到这个模型。比如测试样本中某一指出现的次数、日志分析中某一消息出现的频率等等‘这种类似的需求有很多实现方法。下面就列举几条。 (1)使用dict 看下面代码#codingutf-8 data [‘a‘,‘2‘,2,4,5,‘2‘,‘b‘,4…

Spring事务操作-事务引入

目录 Spring事务操作-事务引入 1.模拟异常 2.测试异常 3.没有使用spring框架的时候异常该如何处理 4.使用spring框架的时候异常该如何处理 5.在spring 进行声明式事务管理&#xff0c;底层使用AOP 6.spring 事务管理API 7.事务操作&#xff08;注解声明式事务管理&…

oracle中取反_oracle正则表达式regexp_like的用法详解

oracle正则表达式regexp_like的用法详解更新时间&#xff1a;2013年06月13日 17:42:05 作者&#xff1a;本篇文章是对oracle正则表达式regexp_like的用法进行了详细的分析介绍&#xff0c;需要的朋友参考下/*ORACLE中的支持正则表达式的函数主要有下面四个&#xff1a;1&…

在r中rowsums_用R进行数据分析-05

20-矩阵与数组一、矩阵的定义矩阵&#xff08;Matrix&#xff09;是一个按照长方阵列排列的复数或实数集。向量是一维的&#xff0c;而矩阵是二维的&#xff0c;需要有行和列。R中&#xff0c;矩阵是有维数的向量&#xff0c;但元素必须拥有相同的模式&#xff0c;此和向量一致…

python字典和集合对象可以进行索引操作_Python中的字典跟集合整理笔记

泛映射类型映射类型&#xff1a;不仅仅是dict&#xff0c;标准库里的所有映射类型都是利用dict来实现的&#xff0c;因此它们有个共同的限制&#xff0c;即只有可散列的数据类型才能用做这些映射的键。(只有键有这个需求&#xff0c;值并不需要必须是可散列的数据类型。)什么是…

JAVA入门级教学之(super的内存示意)

Super的原理&#xff1a; 代表的是当前对象this的父类型特征 如果类加载过程中&#xff0c;这个类有静态代码块&#xff0c;有静态变量&#xff0c;一律都会执行&#xff0c;系统会先分配空间 只要方法调用&#xff0c;就一定会进行方法压栈 new一个方法&#xff0c;其实是调用…

python博客项目评论_Python 爬虫入门——小项目实战(自动私信博客园某篇博客下的评论人,随机发送一条笑话,完整代码在博文最后)...

之前写的都是针对爬虫过程中遇到问题的解决方案&#xff0c;没怎么涉及到实际案例。这次&#xff0c;就以博客园为主题&#xff0c;写一个自动私信博客下的评论人员(在本篇留下的评论的同学也会被自动私信&#xff0c;如果不想被私信&#xff0c;同时又有问题&#xff0c;请私信…

JAVA入门级教学之(猜数字测试)

一个类A有一个实例变量v&#xff0c;从键盘接受一个正整数作为实例变量v的初始值 另外再定义一个类B&#xff0c;对类A的实例变量v进行猜测 如果大了则提示大了 如果小了则提示小了 等于则提示测试成功 猜测数字比大小的测试&#xff1a; /*** author LBJ* version V1.0* P…

硬盘突然提示没有初始化_新硬盘的分区

★前言如果你添加了一个新硬盘到电脑上&#xff0c;但是它没有在文件管理器中出现&#xff0c;你可能需要为它分配一个盘符&#xff0c;或者对它进行初始化并分区才能使用。★警告在分区时&#xff0c;”删除磁盘分区“和”格式化“都会清空该分区的数据&#xff0c;请提前备份…

正高职称 程序员_正高级工程师评审条件最新版

.精选范本正高级工程师评审条件申报条件&#xff1a;学历资历条件具有大学本科以上学历&#xff0c;取得高级工程师资格后&#xff0c;从事本专业工作满5年。外语、计算机、继续教育条件(一)按照规定参加国家统一组织的职称外语和计算机应用能力考试&#xff0c;取得合格证&…

JAVA入门级教学之(简单的程序测试)

请定义一个交通工具(Vehicle)类 其中有属性&#xff1a; 速度speed 体积size 方法移动move() 设置速度setSpeed(int speed) 加速speedUp() 减速speedDown() 最后在测试类Vehicle中的main() 中实例化一个交通工具对象&#xff0c;并通过方法给它初始化speed&#xff0c…

linux怎样判断线程是否暂停_怎样判断股市是否会继续下跌?

之前和大家分享了如何判断大市是否会上涨&#xff0c;这篇文章我再分享下如何判断大市是否会继续下跌。我们对大市的判断原则仍采用&#xff1a;基于技术分析判断危险信号&#xff0c;结合市场消息坐实。基于上一篇文章的基础如何判断股市是否会上涨&#xff1f;是否已跌到底&a…

hfss螺旋平面_利用HFSS设计平面等角螺旋天线

- 73 -利用HFSS设计平面等角螺旋天线杜起飞北京理工大学电子工程系 100081摘要&#xff1a;本文介绍了一种双臂平面等角螺旋天线的设计过程&#xff0c;利用ANSOFT HFSS对其结构进行了建模和仿真&#xff0c;工作频率为0.4GHz&#xff5e;3GHz&#xff0c;电压驻波比VSWR<2.…

JAVA进阶教学之(源码及API文档概述)

1.JDK类库的根类&#xff1a;Object 这个从老祖宗类中的方法我们需要先研究一下&#xff0c;因为这些方法都是所有子类通用的。 任何一个类默认继承Object 就算没有直接继承&#xff0c;也会间接继承 2.Object类中有哪些常用的方法呢&#xff1f; 第一种&#xff1a;去源代码中…