目录

1、问题背景

2、使用API Monitor工具监测目标软件对SystemParametersInfo接口的调用

3、到MSDN上查看SystemParametersInfo API函数的说明,查看到关键参数的含义

4、最后


我们多次在项目中使用API Monitor工具监测参考程序对系统API函数的调用,找到问题的解决办法,API Monitor工具确实很好用,今天我们就来详细介绍一下如何使用API Monitor工具。

1、问题背景

我们以之前一个项目问题为例。在某些场景下,Windows系统因为鼠标没操作出发自动关闭显示器、自动屏保、自动待机等会打断我们正在进行的事务。比如我们当前正在使用会议软件开会,如果系统自动关闭了显示器或者待机,就会打断正在进行中的会议(看不到视频等),用户体验也是非常差的,所以我们要在进入开会状态后,阻止系统屏保,阻止子系统自动关闭屏幕,阻止系统自动待机。

以阻止屏保为例,我们在网上搜索得知,可以调用系统API函数SystemParametersInfo主动关闭屏保,但调用该函数应该使用哪些具体的函数参数,以及使用该函数是否能实现既定的功能,一开始是不得而知的。所以我们想使用API Monitor工具去监控一下一款主流的会议软件,看看该软件是不是调用SystemParametersInfo接口去组织屏保的,以及调用该接口都使用了哪些参数。

2、使用API Monitor工具监测目标软件对SystemParametersInfo接口的调用

启动API Monitor后,先在左边的API函数列表中搜索到SystemParametersInfo函数,勾选上;然后在进程列表中找到目标进程,右键单击目标进程,在弹出的右键菜单中点击Start Monitoring,启动监测,操作步骤如下图所示:

但在进程列表中该参考软件有多个进程(通过进程名称和图标可以看出),不知道哪个是与会议相关的进程。这些进程都要监控,有两个办法。一个是按照上图操作将多个进程一个一个添加到监控列表中,二是在通过API Monitor中点击“Monitor New Process”按钮去启动参考软件:

这样API Monitor就可以监控该参考软件启动的所有进程了。

但好像有时即使通过“Monitor New Process”按钮启动软件,也不会把启动程序的所有进程加入到监控列表中,所以还是需要手动添加到监控进程列表中的。

于是使用参考软件创建一个会议,加入到会议中,然后在监测的进程列表中,切换点击该参考软件的多个进程,看看哪个进程调用SystemParametersInfo函数时传入了SPI_SETSCREENSAVEACTIVE参数,可以按下Ctrl+F快捷键调出搜索窗口,在监测结果中以SPI_SETSCREENSAVEACTIVE为关键字进行搜索,果然监测到了,如下:

  • 上图中有监控进程列表,有多个进程时需要切换查看。
  • 点击监测结果列表中的某行记录,下方callstack子窗口中会显示该行记录对应的函数调用堆栈的(只显示4帧)。

我们单独对监测结果列表截图,可以看的更清楚一点:

在退出会议时,可以监测到又调用了SystemParametersInfo函数(第一个参数传SPI_SETSCREENSAVEACTIVE,第二个参数传TRUE(1),TRUE即表示开启屏保),恢复系统的屏保,如下:

3、到MSDN上查看SystemParametersInfo API函数的说明,查看到关键参数的含义

API Monitor工具开启监测后不仅看到调用了什么API函数禁用屏保,还能看到调用该API函数时传递了什么参数。参考软件的实际运行效果是,入会时禁用屏保仅仅是作用于当前登录的会话,不会保存到系统全局配置里面去的,所以系统重启后读取系统全局配置,系统全局配置中是启用屏保的。

那我们回过头来看这个API函数在MSDN上的说明,对比API Monitor中调用SystemParametersInfo函数设置的参数,看看是否有不写入系统全局配置文件的参数。

对于Windows C++软件开发人员来说,到微软MSDN上查看API接口等的详细说明,是必须要掌握的基础技能!

SystemParametersInfo的fWinIni参数,从参数名称上看好像是和Windows系统配置文件有关,于是查看该参数的说明:

说明中指出,此字段决定是否写入到系统user profile中。从API Monitor监测到参考软件调用SystemParametersInfo时给fWinIni参数设置的值为0,综合参考软件的实际表现,所以确定fWinIni字段就是设置是否写入到系统全局配置文件中的。

MSDN上对SystemParametersInfo函数的最后一个参数fWinIni的说明不够清晰,比较隐晦,我们没搞清楚其对应的真实含义,通过这次问题我们才结合实际现象才搞懂该参数的真实用途。

参考软件在加入会议时调用SystemParametersInfo禁用屏保,给fWinIni参数设置的值为0,那么此次禁止屏保,仅仅是作用于当前登录的会话,不会保存到系统全局配置里面去的。如果入会后出现崩溃或者强杀进程,没机会恢复屏保,但当前禁用屏保只作用于当前登录的会话,系统重启后系统会从系统配置文件中读取到屏保启用的配置项,系统还是能继续屏保的。所以我们软件也可以这样处理的。

入会时调用SystemParametersInfo函数,传入SPI_GETSCREENSAVEACTIVE,获取系统有没有设置屏保,如果设置了屏保,就再调用SystemParametersInfo函数,传入SPI_SETSCREENSAVEACTIVE和FALSE参数,临时取消系统屏保,代码如下:

// 先获取是否启用屏幕保护
SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &m_bScreenSaveActive, 0);
if (m_bScreenSaveActive)
{// 阻止屏保SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0);
}

退会时,如果之前取消了屏保,则再调用SystemParametersInfo函数,传入SPI_SETSCREENSAVEACTIVE和TRUE参数,恢复系统屏保,代码如下:

if (m_bScreenSaveActive)
{// 取消阻止屏保SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0);
}

4、最后

本文通过一个问题实例详细地说明了API Monitor工具的使用,给大家提供一个借鉴或参考。我们已经使用API Monitor工具解决了项目开发过程中遇到的多个问题,没用过的朋友可以尝试着用一下。

对于本文中讲的问题实例,更详细的内容可以参见我之前写的一篇文章:

VC++实现会议中阻止屏保、阻止系统自动关闭屏幕、阻止系统待机(附源码)https://blog.csdn.net/chenlycly/article/details/124526549

API Monitor等工具的下载链接如下:

链接:https://pan.baidu.com/s/1ID6_0RSYKbiy_tzfYDX3Ew 
提取码:tn6i

使用API Monitor监测到目标程序对系统API函数的调用(常用分析工具)相关推荐

  1. API监控平台,统一监控系统API

    API监控平台能实时对企业系统单个API或多步业务流程API进行监控,能正确地了解到API的运行状况,在发现异常时能及时告警,让运维人员能第一时间获取故障信息,及时解决,提升企业的整体业务质量. Re ...

  2. ubuntu安装Linux网络配置,CentOS和Ubuntu系统简要网络配置及常用网络管理工具汇总...

    鉴于不同的用户群体.不同的业务在使用Linux系统时共同的首要问题是解决网络连接的问题,写下这篇博文. 本文主要总结CentOS和Ubuntu系统关于网卡的简要配置以及管理网卡时常用的三个工具的区别( ...

  3. 使用Process Monitor工具监测进程对注册表和文件的操作(常用分析工具)

    目录 1.概述 2.如何使用Process Monitor 3.监测进程操作注册表活动案例

  4. Windows API Monitor

    文章转自  http://www.rohitab.com/apimonitor API Monitor API Monitor v2 is currently in Alpha. Installers ...

  5. android--------内存泄露分析工具—Android Monitor

    Android Studio 内置了四种性能监测工具Memory Monitor.Network Monitor.CPU Monitor.GPU Monitor,我们可以使用这些工具监测APP的状态, ...

  6. 【Linux系统编程学习】C库IO函数与系统IO函数的关系

    此为黑马Linux课程笔记. 1. C标准IO函数工作流程 如图,以C库函数的fopen为例,其返回类型是FILE类型的指针,FILE类型包含很多内容,主要包含三个内容:文件描述符.文件读写指针的位置 ...

  7. API Monitor(API监控工具)

    概观 API Monitor是一个免费软件,可以让你监视和控制应用程序和服务,取得了API调用. 它是一个强大的工具,看到的应用程序和服务是如何工作的,或跟踪,你在自己的应用程序的问题. 产品特点 6 ...

  8. linux sdk 窗口句柄,Venus: 针对Linux平台上,对常用的系统API进行面向对象的封装SDK。...

    Venus 项目介绍 Linux平台上,对常用的系统API进行面向对象的封装SDK,使用C++实现,没有使用C++11特效,支持CentOS.Ubuntu.RedHat各个发行版本和不同内核版本使用, ...

  9. linux 函数手册 在线,Linux系统API函数手册

    Linux系统API函数手册 (34页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 11.90 积分 (一)文件操作篇 1.creat(建立文件)头文件1 ...

  10. Android原生系统API自带dp、px、sp单位转换

    Android系统中自带的Api中可以使用TypedValue进行单位转换 1,调用系统api转换单位 // 获得转换后的px值 float pxDimension = TypedValue.appl ...

最新文章

  1. Permission denied: user=root, access=WRITE, inode=/:hadoopuser:supergroup:drwxr-xr-x
  2. 【运筹学】线性规划 单纯形法 案例二 ( 案例解析 | 标准形转化 | 查找初始基可行解 | 最优解判定 | 查找入基变量与出基变量 | 第一次迭代 )
  3. Centos 5.5下面架设NTP服务器
  4. 女朋友还是游戏?一起来分析下游戏的开发与销售情况!
  5. 重写Object类的equals方法
  6. CUDA+CUDNN下载地址
  7. 关于修改DSDT出现的常见问题
  8. Oracle开窗函数
  9. C#数据结构与算法 培训视频
  10. codevs 4093 EZ的间谍网络
  11. 大学计算机第一课知识点,大学计算机基础第一课
  12. CodeForces - 1485D Multiples and Power Differences (构造+lcm)
  13. docker 20.10.9 dockerd containerd containerd-shim-runc-v2 runc 组件分析
  14. 网络编程中同步与异步,IO阻塞与非阻塞总结
  15. 海思3516开发记录-AAC音频解码
  16. 用友U8案例教程库存管理前台操作
  17. FPU、MMX、SSE
  18. bzoj 2121 字符串游戏
  19. 肖特基二极管的作用与识别方法
  20. 位运算 - 位运算基本操作

热门文章

  1. 结合spring IOC AOP Mybatis写一个简易的银行转账案例
  2. java求职英文简历范本2篇_Java英文简历范文
  3. 微信小程序制作模板套用时需要注意什么呢?
  4. 电子沙盘 数字沙盘 开发教程
  5. 应用开发框架之——数据字典、原数据、模板
  6. IEC 60335标准介绍
  7. 易语言大漠插件模块制作窗口获取窗口句柄类
  8. 8种免费商用中文字体
  9. 京东支付逻辑存在不安全因素
  10. LeetCode c语言解题思路+答案代码+多种解法+关键注释 GitHub持续更新