使用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.xdnf.cn/news/143765.html

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

相关文章

WindTerm 安装使用教程【图解】

往期回顾 MobaXtermMobaXterm 安装使用教程【图解】-CSDN博客WindTermWindTerm 安装使用教程【图解】-CSDN博客 一、WindTerm 功能介绍 WindTerm 是一款 Github 上开源的 SSH 终端工具,到目前为止它已经收获了 16.9K 颗星,它是完全可以比肩 MobaXterm 工…

C语言的学习快速入门

可以按照以下步骤进行: 了解基本概念和语法:C语言是一种结构化的编程语言,了解基本的语法规则对于入门非常重要。可以学习关键字、变量、数据类型、运算符、控制结构等基本概念。学习编程环境:选择合适的编程环境,例如…

Spring事务几种的集中原因

Spring事务失效的几种原因 Spring Boot 项目中事务失效的原因可以有多种,这些原因可能导致你的事务无法正常工作。以下是一些常见的事务失效原因的详细讲解: 不使用Transactional注解: 事务需要通过Transactional注解来声明,如果…

基于yolov5的ignore classes训练

本文提到的忽略类别和检测中的忽略类别不一样,前者是在训练中加入忽略类,后者是在检测中仅检测想要的类。 ignore class的定义 我们在标注数据集的时候都是标注的正样本,训练过程中也是这样训练,让网络对正样本计算loss。但我们…

五、C#—字符串

🌻🌻 目录 一、字符串1.1 字符类型1.2 转义字符1.3 字符串的声明及赋值1.3.1 c# 中的字符串1.3.2 声明字符串1.3.3 使用字符串1.3.4 字符串的初始化1.3.4.1 引用字符串常量之初始化1.3.4.2 利用字符数组初始化1.3.4.3 提取数组中的一部分进行初始化 1.3.…

R的一些奇奇怪怪的功能

1. 欧氏距离计算 df <- data.frame(x 1:10, y 1:10, row.names paste0("s", 1:10)) euro_dist <- as.matrix(dist(df))2. 集合运算 union(x, y) # 并集 intersect(x, y) # 交集 setdiff(x, y) # 只在x中存在&#xff0c;y中不存在的元素 setequal(x, y)…

利用Redis实现全局唯一ID

利用Redis实现全局唯一ID 背景 场景分析&#xff1a;如果我们的id具有太明显的规则&#xff0c;用户或者说商业对手很容易猜测出来我们的一些敏感信息&#xff0c;比如商城在一天时间内&#xff0c;卖出了多少单&#xff0c;这明显不合适。 场景分析二&#xff1a;随着我们商…

慢性疼痛治疗服务公司Kindly MD申请700万美元纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉,慢性疼痛治疗服务公司Kindly MD近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&#xff0c;股票代码为&#xff08;KDLY&#xff09;,Kindly MD计划通过…

PTA程序辅助实验平台——2023年软件设计综合实践_3(分支与循环)

第一题&#xff1a;7-1 印第安男孩 - C/C 分支与循环 朵拉编程的时候也想顺便练习英语。她编程从键盘读入一个整数n&#xff0c;如果n值为0或者1&#xff0c;向屏幕输出“0 indian boy.”或“1 indian boy.”&#xff1b;如果n大于1&#xff0c;比如9&#xff0c;则输出“9 in…

计算机图像处理:图像轮廓

图像轮廓 图像阈值分割主要是针对图片的背景和前景进行分离&#xff0c;而图像轮廓也是图像中非常重要的一个特征信息&#xff0c;通过对图像轮廓的操作&#xff0c;就能获取目标图像的大小、位置、方向等信息。画出图像轮廓的基本思路是&#xff1a;先用阈值分割划分为两类图…

性能测试 —— 性能测试常见的测试指标 !

一、什么是性能测试 先看下百度百科对它的定义&#xff0c;性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 我们可以认为性能测试是&#xff1a;通过在测试环境下对系统或构件的性能进行探测&#xff0c;用以验证在生产环…

mysql面试题3:谈谈你知道的MySQL索引?MySQL中一个表可以创建多少个列索引?MySQL索引有哪几种?他们的优缺点是什么?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:谈谈你知道的MySQL索引? MySQL索引是一种特殊的数据结构,用于加速数据库的查询操作。它通过存储列值和对应记录的指针,可以快速定位到满足查询…

如果只是用php纯做api的话,给移动端做数据接口,是否需要用php框架?

API接口对接是现代软件开发中不可或缺的一部分&#xff0c;它允许不同的应用程序之间进行数据交换和服务调用。在PHP中&#xff0c;可以使用多种方式实现API接口的对接&#xff0c;包括基于HTTP协议的传统方法以及现代的API客户端库客户端库客户端库等。 一、实现API接口的对接…

【React】组件实例三大属性state、props、refs

state React 把组件看成是一个状态机&#xff08;State Machines&#xff09;。通过与用户的交互&#xff0c;实现不同状态&#xff0c;然后渲染 UI&#xff0c;让用户界面和数据保持一致。 React 里&#xff0c;只需更新组件的 state&#xff0c;然后根据新的 state 重新渲染用…

运行在浏览器中的Domino Designer开发客户机

大家好&#xff0c;才是真的好。 首先讨论一个非常有意思的事情&#xff0c;就是有人问&#xff0c;如果我用很老的Lotus软件&#xff0c;它是免费的吗&#xff1f; 这估计代表了很多盆友的心声。但不太友好的是&#xff0c;即使你用很老的Lotus软件&#xff08;例如Notes R4…

百度搜索逐步恢复优质网站权限

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 从9月25日开始&#xff0c;有越来越多的站长和卢松松反馈&#xff0c;说他们的站可以正常入驻百度搜索资源平台了。我也试了试卢松松博客&#xff0c;果然&#xff0c;可以正常提交了。还是以前的…

Redis 线程模式

Redis 是单线程吗&#xff1f; Redis 单线程指的是 [接收客户端请求 -> 解析请求 -> 进行数据读写操作 -> 发送数据给客户端] 这个过程是由一个线程 (主线程) 来完成的&#xff0c;这也是常说的 Redis 是单线程的原因。 但是 &#xff0c;Redis 程序不是单线程的&am…

已实现:关于富文本组件库vue2-editor的使用方法以及一些必要的注意事项,特别是设置完富文本以后的回显问题。以及在光标位置插入字符串等

前言 目前常见的基于vue的富文本编辑器有两个&#xff1a;“vue2-editor” 和 “vue-quill-editor” 都是用于Vue.js的富文本编辑器组件&#xff0c;它们具有一些共同的特点&#xff0c;但也有一些区别。 共同点&#xff1a; 1、富文本编辑功能&#xff1a; 两者都提供了富文…

Ubuntu安装Oracle JDK

文章目录 下载JDK安装Oracle JDK验证安装 下载JDK Oracle JDK需要从Oracle的官方网站下载&#xff0c;访问Oracle的官方网站并下载所需版本的JDK。 https://www.oracle.com/java/technologies/downloads/#java17 安装Oracle JDK 2.1. 下载.tar.gz文件后&#xff0c;移动到适…