使用SystemParametersInfo访问用户界面设置
SystemParametersInfo这个函数还挺有用,它可以用来以代码的方式访问操作系统中的用户界面设置,并且它是唯一一个可以用来修改设置的函数。在今天的文章中,我不会列出该函数支持的所有设置参数,如有需要,请直接出门左转看文档,那里才是你需要去的地方。我只是想说几条比较值得注意的:
> SPI_GETICONTITLELOGFONT
此参数可以用来获取图标文本的字体信息。对应的,SPI_SETICONTITLELOGFONT可以用来进行修改。
> SPI_GETNONCLIENTMETRICS
此参数可以用来获取窗口标题,菜单,状态栏以及消息提示框的字体信息,对应的,SPI_SETNONCLIENTMETRICS可以用来进行修改。
下面是一些控制面板上对应的参数:
> SPI_SETKEYBOARDDELAY 和 SPI_SETKEYBOARDSPEED 可以用来设置键盘自动重复相关的参数。
> SPI_SETDOUBLECLICKTIME 可以用来设置鼠标双击的速度。
> SPI_SETMENUFADE 可以用来启用或禁用菜单淡出动画。
> 另外还有一个SPI_SETxxxANIMATION系列参数,可以用来控制哪些屏幕组件可以进行动画。
请注意,当使用SPI_SET*参数时,你还需要指明待设置的值是临时的(注销后设置失效)还是永久性的。SPIF_UPDATEINIFILE这个标志指定设置将会保存到用户配置文件中。如果关闭这个标志,则设置不会保存,并且会在用户注销的时候失效。另外,你还需要添加SPIF_SENDCHANGE标志,这样那些希望接收设置变化事件的程序可以收到这个通知并作出对应的动作。
因为系统设置的变更可以是临时的,也可以是永久性的,这就会造成一个潜在的问题:那些直接访问注册表以读取或写入系统设置的程序可能不会如预期那样工作。如果当前设置是临时性的,那么这些设置值将不会保存到注册表中。SystemParametersInfo这个函数会获取当前实际的设置值,也包含了那些只是驻留在内存中的临时设置值。
举个例子,如果你想查询当前菜单是否启用了动画,如果用户已经临时性地禁止了动画,如果你通过读取注册表来判断的话,则你读取到的值可能和当前值不一样。另外,那些写入到注册表的设置更改,只会在用户下一次登录的时候才会生效,因为这个时候新的设置值才会被重新加载。
如果你希望设置立即生效,可以使用SystemParametersInfo这个函数。我仍然感到困惑的是,为什么人们去使用未文档化的注册表项来更改这些设置,而不是使用系统API来实现。特别是当API能正常工作,而未文档化注册表项不那么靠谱时。
我还记得,曾经有一个应用程序,它没有系统提供的API,而是直接访问未文档化的注册表键(应该是想获取图标文本字体吧我记得)。但是意外的是,它读取的注册表在Windows 2000里发生了变化(该程序面向Windows 95平台)。如果这个开发者使用了标准化的API来实现的话,则程序不需要经过任何改动就可以在新版本系统中运行。
换句话说,开发者尝试绕开最为合适的技术路线,使用了自己觉得一定能成功的方法。但是最终还是搬起石头砸了自己的脚。
总结
如果你希望的程序存活的时间长一些,则请尽量使用标准化的,文档化的API。
TopomelBox不追求奇淫技巧,而是按部就班的按照文档来,甚至有时候我还会看看API是否标记为Obsolete。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Using SystemParametersInfo to access user interface settings》
相关文章
- [Unity3D]查看与设置游戏帧数FPS
- 问题-[Delphi]无法设置断点
- windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解
- 设置redis访问密码
- 系统设置 - 管理员工具 - 系统设置
- spring:设置映射访问路径 或 xml配置访问路径 (spring mvc form表单)
- MySQL数据库设置远程访问权限方法小结
- linux设置允许和禁止访问的IP host.allow 和 host.deny
- postman 接口请求401错误,设置Bearer Token
- ElasticSearch插件es-head安装及使用:es集群设置了密码时的访问方法
- 巧用Angular项目的get设置Angular class属性访问的别名
- android 11.0 12.0添加系统字体并且设置为默认字体
- Android 8.0设置系统时区
- 安装ubuntu 进行换阿里源 修改语言 添加nfs ssh服务 vim软件设置 搭建xshell6的访问 添加 交叉编译器 qemu 遍地是图, 新手易上手
- 设置同样字体大小,chrome浏览器有时字体偏大的解决办法(转)
- Vue之通过代理设置跨域访问
- ceSetThreadPriority设置线程优先级~!
- Eclipse中设置tomcat的启动内存
- firefox访问失败的时间设置错误问题
- firewalld 设置规则只允许指定ip访问指定端口 —— 筑梦之路
- Win11怎么设置Guest共享访问文件夹?
- [家用路由器] 如何在外网远程管理(控制)tplink路由器?——需要路由器拥有虚拟服务器设置的功能,或者宽带拨号得到的IP地址是公网IP,否则是无法开通外网的访问的
- 查看mysql连接情况,以及连接超时时间设置
- mybatis-plus如何设置分页查询