窗口托盘最小化工具从 Traymond 进化为 Traynard

在前文《增强版 Traymond 让任意窗口最小化到系统托盘》中介绍了一款可以将任意窗口最小化到系统托盘的 Windows 桌面小工具。该工具代码 fork 自另一个同名项目,新增了一些功能并做了界面中文化。不过原项目是基于 Windows API 开发的,没有使用任何 GUI 框架,想要在此之上做进一步扩展非常麻烦,索性推倒重来。

tabris17/traynardgithub.coma Windows desktop utility for minimizing any application window to the system tray

功能介绍

新版本除了保留原来的 icon 外,已全部使用 Lazarus 重写,并在原有功能的基础上,新增了图标分组扩展窗口菜单的功能。

……

什么是 Windows UserChoice 保护驱动(UCPD.sys)

在社交媒体上刷到一条非常扯淡的帖子,算是典型的蛆头为了吃「爱国」流量饭,利用民粹主义,专门针对低认知的蠢货们打造的无耻谣言。冠之以「技术流分析」,实则狗屁不懂。

xhs

言归正传,这个 UCPD.sys 究竟是什么来头呢?故事还要从当年流氓软件大战说起……

早期 Windows 对文件关联(即文件默认打开程序)的管理非常简单——任何程序都可以通过修改注册表键值来修改文件关联。这导致各种流氓软件滥用该特性来霸占用户电脑,特别是国产浏览器,通过修改 http/https 协议关联程序,来劫持用户上网行为。

……

记一次 WinGet 升级故障排查

本文记录一次 WinGet 升级故障排查的过程。最终删除了 Windows 应用商店安装的版本,再使用 Scoop 重新安装,通过这种方式解决了问题。

泄露程序执行记录的 Windows Shim 缓存

Windows Shim 是一种让新操作系统能兼容旧程序的技术。顾名思义,Shim 会在应用程序和操作系统之间增加一层处理逻辑,比如拦截和修改 API 调用的参数和返回值,模拟旧的操作系统,实现兼容应用程序的目的。

由于并非所有的程序都需要进行兼容处理,Windows 为此提供了一个名为 Application Compatibility Database (应用程序兼容性数据库)的数据库,通常简写为 SDB,其中保存了需要兼容的程序清单,以及需要进行的兼容性操作。然而,每次创建进程都要查询数据库会损耗性能,Windows 将查询结果缓存在内存中。该缓存被称作 Application Compatibility Cache,大小为 1024 条,并且在每次系统关机时写入注册表作为持久化保存。正是由于这个特性,导致泄露了用户程序执行记录。

……

泄露 Windows 资源管理器浏览记录的 Shell Bags

Windows 资源管理器会记住用户访问过的每个文件夹的视图细节,包括窗口大小、视图模式、排序方式、图标大小、分组依据等。这个特性有点类似 macOS 系统里的 .DS_store 文件夹。这些文件夹的视图信息会被保存在注册表中,我们根据微软对这组注册表项的命名,将该特性称作 Shell Bags。一些 Windows 取证工具利用该特性,可以提取出用户的访问历史,包括已删除的文件夹、网络文件夹和可移动存储设备文件夹。

……

Zone.Identifier 文件和 NTFS 数据流

使用 Windows 资源管理器,将 Windows 中的文件复制到 WSL 文件系统中时发现,目标路径下会多出一个 Zone.Identifier 后缀的文件:

foo.txt
foo.txt:Zone.Identifier

……

如何判断一个窗口句柄是否为桌面顶层窗口

在微软官方文档中,并没有提供一个 API 用于判断一个窗口句柄是否为桌面的顶层窗口。通过类似 NULL == GetParent(hwnd) 或者 hwnd == GetAncestor(hWnd,GA_ROOT) 等简单代码都无法做出正确判断。经过测试,找到两种靠谱的解决方案。

……

Windows API 编程之调整菜单宽度

好多年没碰 Windows API 编程了,这次写 Traymond 才发现:堂堂 Windows 竟然没有一个 API 能够用来调整菜单的宽度。

通常,在程序中使用的静态菜单都是直接从资源中载入的,而这次需要动态增删菜单项目。这时我才发现一个问题:当用 InsertMenuItem() 函数插入一个菜单项时,Windows 会根据菜单项文本自动增加菜单宽度;但是当使用 DeleteMenu() 函数删除菜单项后,Windows 却无法根据剩余的菜单项文本自动缩小菜单宽度。搜遍全网,也只找到两种解决方法。

……

使用 Windows API 将图标转换成位图

在不依赖任何第三方库、仅使用 Windows API 的前提下,需要将窗口图标(HICON)转换成作为菜单图标的位图(HBITMAP)。

……

增强版 Traymond 让任意窗口最小化到系统托盘

本项目已更名为 Traynard,并使用 Lazarus 完全重构。新版本提供更多的功能和更加易用的操作界面。原增强版 Traymond 仅保留下载,不再更新。

详见:窗口托盘最小化工具从 Traymond 进化为 Traynard

Traymond 是一款 Windows 上的小工具,可以将任意窗口最小化为系统托盘图标,双击图标即可还原窗口。软件启动后会在后台运行,按下热键 Win + Shift + Z 后,当前窗口会最小化到系统托盘图标,双击图标可以恢复窗口。软件正常退出时会自动恢复期间最小化的窗口。另外,如果程序意外终止,重新启动程序,最小化窗口的都会恢复。

……