- 标签
- Windows
本文记录一次 WinGet 升级故障排查的过程。最终删除了 Windows 应用商店安装的版本,再使用 Scoop 重新安装,通过这种方式解决了问题。
Windows Shim 是一种让新操作系统能兼容旧程序的技术。顾名思义,Shim 会在应用程序和操作系统之间增加一层处理逻辑,比如拦截和修改 API 调用的参数和返回值,模拟旧的操作系统,实现兼容应用程序的目的。
由于并非所有的程序都需要进行兼容处理,Windows 为此提供了一个名为 Application Compatibility Database (应用程序兼容性数据库)的数据库,通常简写为 SDB,其中保存了需要兼容的程序清单,以及需要进行的兼容性操作。然而,每次创建进程都要查询数据库会损耗性能,Windows 将查询结果缓存在内存中。该缓存被称作 Application Compatibility Cache,大小为 1024 条,并且在每次系统关机时写入注册表作为持久化保存。正是由于这个特性,导致泄露了用户程序执行记录。
……
Windows 资源管理器会记住用户访问过的每个文件夹的视图细节,包括窗口大小、视图模式、排序方式、图标大小、分组依据等。这个特性有点类似 macOS 系统里的 .DS_store 文件夹。这些文件夹的视图信息会被保存在注册表中,我们根据微软对这组注册表项的命名,将该特性称作 Shell Bags。一些 Windows 取证工具利用该特性,可以提取出用户的访问历史,包括已删除的文件夹、网络文件夹和可移动存储设备文件夹。
……
使用 Windows 资源管理器,将 Windows 中的文件复制到 WSL 文件系统中时发现,目标路径下会多出一个 Zone.Identifier 后缀的文件:
foo.txt
foo.txt:Zone.Identifier
……
在微软官方文档中,并没有提供一个 API 用于判断一个窗口句柄是否为桌面的顶层窗口。通过类似 NULL == GetParent(hwnd)
或者 hwnd == GetAncestor(hWnd,GA_ROOT)
等简单代码都无法做出正确判断。经过测试,找到两种靠谱的解决方案。
……
好多年没碰 Windows API 编程了,这次写 Traymond 才发现:堂堂 Windows 竟然没有一个 API 能够用来调整菜单的宽度。
通常,在程序中使用的静态菜单都是直接从资源中载入的,而这次需要动态增删菜单项目。这时我才发现一个问题:当用 InsertMenuItem()
函数插入一个菜单项时,Windows 会根据菜单项文本自动增加菜单宽度;但是当使用 DeleteMenu()
函数删除菜单项后,Windows 却无法根据剩余的菜单项文本自动缩小菜单宽度。搜遍全网,也只找到两种解决方法。
……
在不依赖任何第三方库、仅使用 Windows API 的前提下,需要将窗口图标(HICON)转换成作为菜单图标的位图(HBITMAP)。
……
Traymond 是一款 Windows 上的小工具,可以将任意窗口最小化为系统托盘图标,双击图标即可还原窗口。软件启动后会在后台运行,按下热键 Win + Shift + Z 后,当前窗口会最小化到系统托盘图标,双击图标可以恢复窗口。软件正常退出时会自动恢复期间最小化的窗口。另外,如果程序意外终止,重新启动程序,最小化窗口的都会恢复。
……
UWP 应用默认不允许访问本地 localhost 地址。微软应用商店也属于 UWP 应用,如果 Windows 开启了系统代理,且代理服务器是地址是 localhost 的话,微软应用商店就无法联网。而每次启动微软应用商店就要关闭系统代理会非常麻烦。
通过下面的命令可以允许微软应用商店访问本地代理:
……
自 Windows Vista 和 Windows Server 2008 开始,操作系统界面默认的字体为 Segoe UI ,而 Windows XP 及之前的系统界面默认字体为 Tahoma 。不过 Segoe UI 字体的字形并不包含包括汉字在内的东亚文字。中文版 Windows 使用微软雅黑作为默认中文字体。
其他语言的默认字体见下表:
语言 | 字体 |
---|---|
简体中文 | Microsoft YaHei UI |
繁体中文 | Microsoft JhengHei UI |
日文 | Yu Gothic UI |
韩文 | Malgun Gothic |
希伯来文 | Gisha |
泰文 | Leelawadee |
不过相较于查表获取 Windows 系统的默认字体,使用 Windows API 来获取当前系统的默认字体会更加可靠。
……