zl程序教程

您现在的位置是:首页 >  其它

当前栏目

使用SystemParametersInfo访问用户界面设置

设置 访问 用户界面 使用
2023-09-14 09:10:44 时间

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》