使用SPY++查看窗口信息去排查客户端UI软件问题

目录

1、使用SPY++查看窗口的信息

2、使用SPY++查看某些软件UI窗口用什么UI组件实现的

2.1、查看海康视频监控客户端安装包程序

2.3、查看字节协同办公软件飞书

2.4、查看最新版本的Chrome浏览器

2.5、查看小鱼易连视频会议客户端软件

2.6、常用的UI界面库

3、查看窗口最小化时的窗口位置

4、查看主流软件的窗口风格,猜测其UI界面是如何实现的

5、将所有窗口的信息导出到文件中

6、最后


VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具从入门到精通案例集锦(专栏文章正在更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795C/C++基础与进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.html       SPY++是微软Visual Studio自带的一个用来查看窗口属性、窗口消息、进程与线程的工具,在日常工作中处理UI窗口事务用的比较多,今天就来给大家讲一下这个工具的用途。使用该工具去查看窗口属性,可以去辅助分析C++客户端UI程序的问题。

1、使用SPY++查看窗口的信息

       SPY++工具打开后,会显示当前系统中所有打开的窗口信息,如下所示:

如果系统有窗口发生改变,比如新增或销毁窗口,则需要点击工具栏中的刷新按钮手动刷新一下。

       可以点击工具栏中的望远镜按钮:

 在打开的窗口搜索窗口中可以按窗口句柄、窗口标题或者窗口类名去搜索目标窗口,以企业微信窗口标题为例,如下所示:

这样就搜索到了企业微信的主窗口,右键点击,就可以查看企业微信主窗口的信息,比如窗口坐标:

点击样式标签页,可以查看到窗口的基本样式和扩展样式,如下:

 如果窗口风格中有WS_CHILD,表示该窗口是子窗口;窗口是否处于显示状态(非掩藏状态),看窗口是否WS_VISIBLE风格。关于窗口风格的详细说明,可以查看我之前写的文章:
VC++ Win32界面编程中的窗口风格要点总结(附源码)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/121572701此外还可以点击类标签页,查看窗口类名;点击进程标签页,查看窗口所属进程和线程信息。

2、使用SPY++查看某些软件UI窗口用什么UI组件实现的

       点击工具栏中的查看窗口按钮,弹出如下窗口:

左键点击图中按钮,一直按着不放,然后将光标移动到目标程序窗口上,这样就能查看到窗口的类名,通过类名我们大概就能猜出对应如软件的UI界面是使用何种UI组件实现的。

2.1、查看海康视频监控客户端安装包程序

       使用上面的方法探测海康视频监控客户端安装包程序的主窗口,探测到的窗口类如下所示:

看到安装包主窗口用的是对话框。也可以探测安装包窗口中的编辑框和按钮的窗口类,分别是Edit和Button,所以估计该安装包是用MFC实现的。

       使用上面的方法探测WeLink的登陆窗口,探测到的窗口类如下所示:

可以看到类名为Chrome_WidgetWin_1,包含Chrome字样,所以估计WeLink UI界面是用Chrom浏览器UI组件实现的。也可以探测登陆后的主窗口,主窗口的类名也是Chrome_WidgetWin_1。

2.3、查看字节协同办公软件飞书

       使用上面的方法探测到飞书的窗口中均包含Chrome字样,如下所示:

从上图可以看出窗口类类名为Chrome_RenderWidgetHostHWND,说明飞书软件的UI界面也是用Chrome浏览器UI组件实现的。

2.4、查看最新版本的Chrome浏览器

       使用上面的方法探测Chrome浏览器窗口,如下所示:

窗口类名为Intermediate D3D Window,好像并不包含Chrome字样,是不是和上面讲的不一致?最新版本的Chrome浏览器不再使用自己开源的UI界面组件了?其实这个和GPU加速有关,如果将GPU加速关闭掉,窗口的类名中就会包含Chrome字样了。如果想搞清楚具体原因,可以去查看开源项目Chromium源码,去一探究竟!

2.5、查看小鱼易连视频会议客户端软件

       使用上面的方法探测小鱼易连视频会议客户端软件的主窗口,如下所示:

窗口类名为Qt5152QWindowIcon,所以该软件的UI界面使用QT库实现的。

2.6、常用的UI界面库

        这个地方顺便说一下Windows平台上C++软件常用的UI界面库,主要有MFC、duilib、QT和开源的Chrome UI组件库。

        其中,MFC库是微软的一套很古老的界面库,实现酷炫的界面比较麻烦,大型商业软件基本都不用了,但有个行业除外,很多炒股软件客户端还是使用。

        duilib库是开源的,很多软件都在使用,比如百度云管家、爱奇艺PPS视频客户端、华为手机助手PC客户端等。

        QT库最近几年比较好,国产化进程被提到了一个很高的高度,基本所有国产化系统上的软件客户端都使用QT,有些软件为了实现跨平台,Windows和Linux平台均使用QT跨平台库,比如很多安防厂商的视频监控客户端软件都使用QT库,比如海康威视和浙江大华的客户端软件。

        Chrome浏览器的UI界面组件,最近几年也比较火,很多厂商的客户端软件都在使用,比如华为的WeLink、字节飞书、阿里钉钉、有道字典、有道云笔记等。

3、查看窗口最小化时的窗口位置

       以企业微信主窗口为例,点击工具栏中的按钮,然后将探测按钮拖到企业微信的主窗口上,然后探测到:

点击确定按钮,就会弹出窗口的属性窗口,在常规标签页中可以看到企业微信主窗口处于正常显示状态时窗口坐标,如下所示:

然后将企业微信主窗口最小化,然后在上述页面中点击刷新按钮,刷新一下窗口的信息,看到窗口坐标变成如下的值:

窗口的宽高不变,但窗口left、top、right、bottom坐标值变成了很大的负值,所以将窗口最小化时系统将窗口移动到一个远离桌面可见区域的一个地方了,窗口还处于显示状态,是和掩藏状态有区别的。

4、查看主流软件的窗口风格,猜测其UI界面是如何实现的

       现在主流的视频会议软件都支持发送共享图像,比如桌面共享,其中两个厂商不仅支持桌面共享,还支持在桌面上框出某个区域进行共享。我们在某个定制项目中客户要求也要支持区域共享,应该是这两个厂商参与项目竞标,向客户宣导了这个功能,所以客户也想实现这个功能。

       于是我们就研究了支持该功能的友商的软件,看看是什么样的交互,模仿着他们的效果实现一下。区域共享的效果如下:

框选共享区域的选择是客户拖动的,拖标题栏可以移动整个选择框窗口;拖动窗口边界区域,可以调整选择框的大小。此外,选择框中间区域是透明的,边框比较简单,这个透明区域是怎么实现的呢?猜测可能是用Layered分层窗口实现的。于是使用SPY++查看区域选择框窗口的属性,查看窗口风格,果然设置了WM_EX_LAYERED属性,如下所示:

选择区域窗口,边界不透明,中间区域透明,应该是调用系统API函数UpdateLayeredWindow实现的。具体的细节,之前已经写成了一篇详细的文章,想了解的,可以去查看这篇文章:
使用Layered分层窗口实现会议中的桌面区域共享功能icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/120756341

5、将所有窗口的信息导出到文件中

       可以将某个时刻系统中打开的所有窗口信息保存到文件中,如果要保存最新的,需要点击工具栏中的刷新按钮,将窗口信息刷成最新的,然后再保存。点击菜单栏中的目录树->将目录树保存到文件中,即可导出到一个后缀名为.sxt文件中,该文件可以直接用记事本或者Notepad++查看,比如:

这个导出到文件中的功能在排查软件因为窗口问题导致崩溃的问题时可能有用,比如崩溃在某个窗口代码中,但调用堆栈都是系统框架的代码,我们只能看到句柄值,我们搞不清楚到底是哪个窗口,如果我们事先将窗口信息保存到文件中,我们使用窗口句柄到文件中搜索就能看到窗口的类名等信息,这样可能就能确定发生崩溃的窗口是哪个了,我们在实际的项目中就使用过保存到文件的功能。

6、最后

       除了上述功能之外,还可以捕捉窗口的窗口消息,有时在分析窗口消息问题会有一定的用处。SPY++是比较简单的工具,本文根据日常使用经验给大家做个总结,以供借鉴和参考! 

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

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

相关文章

C/S架构学习之UDP服务器

UDP服务器的实现流程:一、创建用户数据报套接字(socket函数):通信域选择IPV4网络协议、套接字类型选择数据报式; int sockfd socket(AF_INET,SOCK_DGRAM,0); 二、填充服务器的网络信息结构体:1.定义网络信…

Java初始化大量数据到Neo4j中(一)

背景:我们项目第一次部署图数据库,要求我们把现有的业务数据以及关系上线第一时间初始化到Neo4j中。开发环境数据量已经百万级别。生成环境数据量更多。 我刚开始开发的时候,由于对Neo4j的了解并没有很多,第一想到的是用代码通用组…

Mybatis 批量修改数据,,并判断非空数据插入

方法一&#xff1a; <update id"updateListPO"> <foreach collection"list" separator";" item"item">UPDATE project_quotation_item<SET>product_num #{item.productNum},product_price_total #{item.pr…

CIP或者EtherNET/IP中的PATH是什么含义?

目录 SegmentPATH举例 最近在学习EtherNET/IP&#xff0c;PATH不太明白&#xff0c;翻了翻规范&#xff0c;在这里记个笔记。下面的叙述可能是中英混合&#xff0c;有一些是规范中的原文我直接搬过来的。我翻译的不准确。 Segment PATH是CIP Segment中的一个分类。要了解PATH…

每日一题 322零钱兑换(完全背包)(灵神版本)

题目 与01背包的区别就是可以重复拿一件物品 零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff…

Dev C++安装与运行

参考: https://blog.csdn.net/Keven_11/article/details/126388791 https://www.cnblogs.com/-Wallace-/p/cpp-stl.html 2021年真题要求 2022年真题要求 河南省的考试环境 IDE环境 Dev C 安装 下载 安装 点击OK&#xff0c;选择我接受 修改安装路径为D盘d:\Program Fi…

MQTT协议是什么?快速了解MQTT协议在物联网中的应用

随着工业互联网的迅猛发展&#xff0c;工业设备数据采集和实时监控成为制造业提高生产效率和质量的重要手段。在物联网应用中&#xff0c;通信技术包括Wi-Fi、RFID、NFC、RS232、RS485、USB等&#xff0c;其中在物联网技术框架体系中所使用到的通讯协议主要有&#xff1a;AMQP、…

[ruby on rails] postgres sql explain 优化

一、查看执行计划 sql User.all.to_sql # 不会实际执行查询 puts ActiveRecord::Base.connection.explain(sql)# 会实际执行查询&#xff0c;再列出计划 User.all.explain# 会实际执行查询&#xff0c;再列出计划ActiveRecord::Base.connection.execute(EXPLAIN ANALYZE sql…

[论文笔记]P-tuning

引言 今天带来第四篇大模型微调的论文笔记GPT Understands, Too。 本篇工作提出的方法是P-tuning,使用可训练的连续提示嵌入,使GPT在NLU上表现比传统的全量微调的GPT更好的效果。P-tuning还提高了BERT在少样本和监督设定下的性能,大幅减少了提示工程的需求。 总体介绍 根…

Django(21):使用Celery任务框架

目录 Celery介绍Celery安装Celery使用项目文件和配置启动Celery编写任务调用异步任务查看任务执行状态及结果 设置定时和周期性任务配置文件添加任务Django Admin添加周期性任务启动任务调度器beat Flower监控任务执行状态Celery高级用法与注意事项给任务设置最大重试次数不同任…

2023-09-28 mysql-代号m-schema调研-文档记录

摘要: mdb中的database与mdb中的database的概念南辕北辙, 可以说有着本质的不同. mysql中的database可以看作是table的namespace, 而在mdb中, 与此相似的概念也就是table的namespace的概念, 是schema. 为了将mysql的db与mdb的schema建立映射关系后的技术风险可控, 需要详细分…

26663-2011 大型液压安全联轴器 课堂随笔

声明 本文是学习GB-T 26663-2011 大型液压安全联轴器. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了大型液压安全联轴器的分类、技术要求、试验方法及检验规则等。 本标准适用于联接两同轴线的传动轴系&#xff0c;可起到限制…

面试算法14:字符串中的变位词

题目 输入字符串s1和s2&#xff0c;如何判断字符串s2中是否包含字符串s1的某个变位词&#xff1f;如果字符串s2中包含字符串s1的某个变位词&#xff0c;则字符串s1至少有一个变位词是字符串s2的子字符串。假设两个字符串中只包含英文小写字母。例如&#xff0c;字符串s1为&quo…

软考高级之系统架构师之软件需求工程

概述 一个完整的软件生存周期是以需求为出发点。软件需求是指用户对系统在功能、行为、性能、设计约束等方面的期望。 需求开发&#xff1a; 需求获取需求分析需求定义&#xff08;需求规格说明书&#xff09;需求验证 需求管理: 变更控制版本控制需求跟踪需求状态跟踪 需…

零基础Python经验体验代码检查工具

作者&#xff1a;yd_257945187 原文链接&#xff1a;零基础Python经验体验代码检查工具-云社区-华为云 1 开发小白自述 年初&#xff0c;我开始从java语言转战Python语言的开发&#xff0c;对于零基础python经验的人来说&#xff0c;要开发出高质量且安全性能高的Python 代码…

解决craco启动react项目卡死在Starting the development server的问题

现象&#xff1a; 原因&#xff1a;craco.config.ts配置文件有问题 经过排查发现Dev开发模式下不能有splitChunk的配置&#xff0c; 解决办法&#xff1a; 加一个生产模式的判断&#xff0c;开发模式不加载splitChunk的配置&#xff0c;仅在生产模式才加载 判断条件代码&#…

notepad++配置python2环境

&#xff08;1&#xff09;python2版本下载&#xff1a;Index of /ftp/python/2.7.8/https://www.python.org/ftp/python/2.7.8/ &#xff08;2&#xff09; 配置notepad环境 1.打开Notepad&#xff0c;点击“插件”-“插件管理器”&#xff0c;在“可用”选项卡中&#xff0c…

云安全之访问控制介绍

访问控制技术背景 信息系统自身的复杂性、网络的广泛可接入性等因素&#xff0c;系统面临日益增多的安全威胁&#xff0c;安全问题日益突出&#xff0c;其中一个重要的问题是如何有效地保护系统的资源不被窃取和破坏。 访问控制技术内容包括访问控制策略、访问控制模型、访问…

《学术小白学习之路13》基于DTM和主题共现网络——实现主题时序演化网络分析(数据代码在结尾)

《学术小白学习之路13》基于DTM和主题共现网络实现主题演化网络分析 一、数据导入二、数据预处理2.1分词2.2 向量化三、DTM建模3.1 主题一致性检验3.2主题建模四、计算主题的相似度4.1获取文档主题分布4.2 时期分组4.3相似度计算4.3.1第一时期和第二时期的对比4.3.2第二时期与第…

ip地址可以精确定位吗

在互联网时代&#xff0c;IP地址的重要性不言而喻。作为网络通信的基础&#xff0c;IP地址用于标识每一台连接到互联网的设备。然而&#xff0c;传统的IP地址定位方式仅能粗略地确定设备的大致位置&#xff0c;无法实现精确定位。那么&#xff0c;IP地址能否实现精确定位呢&…