使用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.rhkb.cn/news/143479.html

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

相关文章

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 A: 子 2023

[蓝桥杯 2023 国 B] 子 2023 试题 A: 子 2023 【问题描述】 小蓝在黑板上连续写下从 1 1 1 到 2023 2023 2023 之间所有的整数,得到了一个数字序列: S 12345678910111213 ⋯ 20222023 S 12345678910111213\cdots 20222023 S12345678910111213⋯2…

讯飞星火认知大模型Java后端接口

文章目录 1.免费申请星火大模型套餐2.Java后端接口说明2.1 项目地址2.2 项目说明2.3 项目结构2.4 项目代码🍀 maven 依赖🍀 application.yml 配置文件🍀 config 包📌 XfXhConfig 🍀 dto 包📌 MsgDTO&#x…

element中使用el-steps 进度条效果demo(整理)

<template><div class"margin-top20"><!-- align-center 不要居中就去掉 --><!-- process-status 这几个参数值&#xff1a;改变颜色 wait / process / finish / error / --><!-- active 到第几个是绿色 --><el-steps :space&qu…

深度解读F5:从企业级负载均衡到云原生应用服务

上世纪九十年代&#xff0c;Internet 的快速发展催生了大量在线网站&#xff0c;Web 访问量迅速提升。在互联网泡沫破灭以前&#xff0c;这个领域基本是围绕如何对 Web 网站进行负载均衡与优化。因而在早期&#xff0c;也会有“Web 交换机”的说法。从1997年 F5 发布了 BIG-IP …

黑马JVM总结(二十五)

&#xff08;1&#xff09;字节码指令-cinit 构造方法可以分为两类&#xff0c;一类是cinit 一类init cinit是整个类的构造方法 putstatic&#xff1a;进行static变量的赋值&#xff0c;是到常量池里找到名字一个叫做i的变量 &#xff08;2&#xff09;字节码指令-init in…

JimuReport积木报表 v1.6.2 版本正式发布—开源免费的低代码报表

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

mysql面试题2:说一说MySQL的架构设计?一条 MySQL 语句执行的步骤?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说MySQL的架构设计? MySQL的架构设计主要包括以下几个组件: 连接器(Connector):负责与客户端建立连接,并进行身份验证和授权。 查询缓存…

BFS专题7 多终点迷宫问题

题目&#xff1a; 样例&#xff1a; 输入 3 3 0 0 0 1 0 0 0 1 0 输出 0 1 2 -1 2 3 -1 -1 4 思路&#xff1a; 单纯的 BFS 迷宫问题&#xff0c;只是标记一下每个点的 step&#xff0c;注意初始化答案数组都为 -1. 代码详解如下&#xff1a; #include <iostream> #…

常用接口测试工具

首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把数据库共享给你&#xff0c;他只能给你…

五、3d场景的卡片展示的创建

在我们3d的开发中&#xff0c;对某一些建筑和物体进行解释说明是非常常见的现象&#xff0c;那么就不得不说卡片的展示了&#xff0c;卡片展示很友好的说明了当前物体的状态&#xff0c;一目了然&#xff0c;下面就是效果图。 它主要有两个方法来实现&#xff0c;大量的图片建议…

最近很火的AIGC人工智能之AI赋能运营(巧用ChatGPT轻松上手新媒体)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

阿里云服务器技术创新、网络技术和数据中心技术说明

阿里云服务器技术创新、网络技术创新、数据中心技术创新和智能运维&#xff1a;云服务器方升架构、自研硬件、自研存储硬件AliFlash和异构计算加速平台&#xff0c;以及全自研网络系统技术创新和数据中心巴拿马电源、液冷技术等技术创新说明&#xff0c;阿里云百科分享阿里云服…

算法-堆/多路归并-查找和最小的 K 对数字

算法-堆/多路归并-查找和最小的 K 对数字 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/find-k-pairs-with-smallest-sums/description/?envTypestudy-plan-v2&envIdtop-interview-150 1.2 题目描述 2 优先级队列构建大顶堆 2.1 思路 将两个数字的和放入大…

Spring面试题23:Spring支持哪些事务管理类型?Spring框架的事务管理有哪些优点?你更倾向用哪种事务管理类型?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring支持哪些事务管理类型? Spring 支持以下几种事务管理类型: 编程式事务管理:通过在代码中显式地使用事务管理 API(如 TransactionTempla…

英飞凌 Tricore 架构中断系统详解

本文以TC3系列MCU为例&#xff0c;先来了解中断源是如何产生的&#xff0c;再看一下CPU是如何处理中断源的。 AURIX TC3XX的中断路由模块 Interrupt Router (IR) 在TC3中&#xff0c;中断既可以被CPU处理&#xff0c;也可以被DMA处理&#xff0c;所以手册中不再把中断称为中断…

Spring 学习(九)整合 Mybatis

1. 整合 Mybatis 步骤 导入相关 jar 包 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency>…

软件测试/测试开发丨岗位内推-58同城岗位开放~

58同城-测试工程师 岗位职责 1.参与需求分析、设计评审&#xff0c;制定测试计划&#xff0c;设计测试用例&#xff0c;搭建测试环境&#xff1b; 2.执行各级别和类型的测试&#xff0c;参与互联网测试的全流程&#xff1b; 3.借助最前沿的研发技术和理念&#xff0c;通过测…

短视频矩阵源码saas版开发---技术成品打磨

短视频矩阵源码saas版开发---技术成品打磨 企业要不要做抖音&#xff1f; 我的答案是要&#xff0c;而且要快&#xff0c;原因有以下几点&#xff1a; 1. 抖音高速增长未停&#xff0c;流量红利还未完全释放完&#xff0c;仍然有增长空间&#xff1b; 2. 抖音变现能力越来越…

《家的温暖,国庆团圆》

目录 &#x1f4d6; 引言 &#x1f4dd; 假日放假表 &#x1f365; 中秋节 &#x1f4da; 中秋节的由来 中秋节的仪式 &#x1f4da; 赏月 &#x1f4da; 吃月饼 &#x1f4da; 猜灯谜 &#x1f4da; 品茶赏花 &#x1f4da; 舞狮龙 &#x1f4da; 中秋节的感触 &am…

C++项目笔记--基于TensorRT搭建一个YoloV5服务器

目录 1--项目描述 2--项目地址 3--编译运行 4--测试结果 5--补充说明 1--项目描述 ① 基于 C/S 模型来构建 TCP 服务器和 TCP 客户端。 ② 使用 Epoll 来监控服务器和客户端之间的连接。 ③ 服务器和客户端约定使用相同的数据传输协议&#xff0c;头部分别使用 4 个字节来…