- 标签
- Windows
在前文《增强版 Traymond 让任意窗口最小化到系统托盘》中介绍了一款可以将任意窗口最小化到系统托盘的 Windows 桌面小工具。该工具代码 fork 自另一个同名项目,新增了一些功能并做了界面中文化。不过原项目是基于 Windows API 开发的,没有使用任何 GUI 框架,想要在此之上做进一步扩展非常麻烦,索性推倒重来。
新版本除了保留原来的 icon 外,已全部使用 Lazarus 重写,并在原有功能的基础上,新增了图标分组和扩展窗口菜单的功能。
……
在社交媒体上刷到一条非常扯淡的帖子,算是典型的蛆头为了吃「爱国」流量饭,利用民粹主义,专门针对低认知的蠢货们打造的无耻谣言。冠之以「技术流分析」,实则狗屁不懂。
言归正传,这个 UCPD.sys 究竟是什么来头呢?故事还要从当年流氓软件大战说起……
早期 Windows 对文件关联(即文件默认打开程序)的管理非常简单——任何程序都可以通过修改注册表键值来修改文件关联。这导致各种流氓软件滥用该特性来霸占用户电脑,特别是国产浏览器,通过修改 http/https 协议关联程序,来劫持用户上网行为。
……
本文记录一次 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)。
……