Skip to content

Releases: jiyihao/memtidy

v0.1.6 — MemTidy 2.4 深度整理

Choose a tag to compare

@jiyihao jiyihao released this 25 Oct 14:34

MemTidy 2.4 · 一键深度整理

一键整理从两招升级为五步组合拳,每步单独显示释放量:

  1. 全进程工作集修剪(带进度条)
  2. 待机内存列表清理(管理员)
  3. 已修改脏页写回并释放(把脏页强制写回页面文件)
  4. 重复物理页合并(Win10 1607+;Win11 24H2 起系统已移除该接口,自动降级跳过)
  5. 第二轮工作集修剪(收割第一轮后被拉回的页面)

整理完成后自动列出占用最大且可安全结束的前 3 个进程,提示你手动清场。

玻璃引擎通透端修复: 透明度调到 100% 不再是浓彩“调色板”——彩色光斑与饱和度随透明度淡出,能真正看清背后桌面;出厂 74% 观感逐像素不变。

仓库更名: glass-ui → memtidy,本仓库现在是 MemTidy 内存整理器的主页;glass-ui 库照常发布在 PyPI(pypi.org/project/glass-ui),pip install glass-ui 不受影响。


下载:附件 MemTidy.exe(v2.4,无需安装)。MD5:4e26c3bc16142f82653b82bb9f9d0fe2

glass-ui v0.1.5 / MemTidy 2.3 — 截屏不再消失、可拖动滚动条、搜索与可清理排序

Choose a tag to compare

@jiyihao jiyihao released this 25 Oct 10:13

MemTidy 2.3 / glass-ui 0.1.5

四个来自真实使用反馈的改进。

新特性

1. Win+Shift+S 截屏时窗口不再消失

旧版为了防止玻璃背景"抓屏套娃",给窗口挂了 WDA_EXCLUDEFROMCAPTURE(从捕获中排除)。但 Win+Shift+S 的全屏遮罩本身就是系统级捕获会话——排除标志会让窗口在遮罩期间从屏幕上整个消失,用户一截屏工具就"蒸发"。

v0.1.5 起不再排除:首次抓屏改在窗口显示前完成(背景完全干净),显示中重抓混入的自身模糊影像在视觉上等同玻璃反光,且随重抓衰减。代价是玻璃底色偶尔会带上一点自己上一帧的"倒影"——这是有意的设计取舍。

2. 进程列表滚动条可以拖了

右侧滚动条从纯指示条升级为完整交互:按住 thumb 拖动、点击轨道向对应方向翻一屏、悬停/拖动时变色。不习惯滚轮翻页的可以拖了。

3. 搜索 + 可清理排序

  • 表头右侧新增搜索框,按进程名实时过滤(防抖 200ms);
  • 新增"排序"循环按钮:可清理优先(默认)→ 按内存 → 按名称;
  • "可清理优先"模式下,进程按三档排列:当前权限下可直接结束 → 受系统保护(拿不到终止句柄)→ 保护名单(系统关键进程)。同档内按内存从大到小;
  • 结束进程前的保护检查同步升级:除了名单,还会实测终止句柄,两类"删不掉"的都会提前拦截并说明。

4. 启动时询问运行模式

普通权限启动时会弹一次玻璃弹窗:以管理员重启(走 UAC)或普通模式继续。以管理员运行时不再询问。「清理待机内存」和结束更多后台进程都需要管理员权限。

下载

  • MemTidy 2.3 (Windows x64) — 单文件 exe,双击即用(Win10 2004+)
  • Python 用户:pip install glass-ui==0.1.5

验证记录

  • GetWindowDisplayAffinity 回读 = WDA_NONE(0x0),系统级抓屏拍到窗口内容(与基准截图平均像素差 24.2/255)
  • 滚动条拖动 / 轨道翻页 / 悬停变色 / 行选择共存:事件级自动化断言 15/15 通过
  • 搜索过滤、三档排序、启动询问:exe 自检通过(含打包环境)
  • 无边框窗口任务栏 / Alt+Tab 样式:WS_EX_APPWINDOW=有 TOOLWINDOW=无

更正

旧文档(PITFALLS 第 13 条)称抓屏递归"必须"用排除标志解决——实测排除标志的副作用(截屏时窗口消失)不可接受,已改写为"映射前抓屏"方案,并新增第 21、22 条踩坑记录。

glass-ui v0.1.3 — 修复无边框窗口不进任务栏与 Alt+Tab

Choose a tag to compare

@jiyihao jiyihao released this 25 Oct 08:57

修了什么

无边框窗口不进任务栏、不出现在 Alt+Tab

overrideredirect(True) 会给顶层窗口打上 WS_EX_TOOLWINDOW,这是窗口"从任务栏消失"的直接原因。Windows 把带这个标志的窗口当成工具窗口处理,既不建任务栏按钮,也不进 Alt+Tab 列表。

本次新增 glass_ui.win.make_taskbar_window():把扩展样式改成 WS_EX_APPWINDOW、同时清掉 WS_EX_TOOLWINDOW,再调 SetWindowPos(..., SWP_FRAMECHANGED) 强制系统重算窗口框架。少了最后那一步,样式虽然改对了,任务栏按钮依旧不会出现。

为什么必须放在 on_map 里

这是本次踩得最深的一个坑:overrideredirect() 的取值每次变化(False→True 或 True→False)都会重建顶层 HWND,新句柄的扩展样式回到 Tk 默认的 0x80。最小化恢复走的正是 False→True 这条路,所以建窗阶段补的样式会被冲掉,必须在 <Map> 里、并且确定在 overrideredirect(True) 之后再打一遍。

别把这条写过头:实测同值重复调用不重建 HWND(True→True→True 句柄不变、样式不变)。完整的测量表在 docs/PITFALLS.md 第 12 条。

GlassWindow.after_map_settle() 里还做了一次延迟 80ms 的二次确认,兜住个别系统上映射瞬间句柄仍不稳定的情况。

其它

  • 新增 glass_ui.win.get_exstyle(),返回无符号 32 位扩展样式,方便调试与断言
  • GlassWindow.taskbar_state() 返回可直接断言的样式快照
  • 新增 GlassWindow.button_width(),按文字实际宽度算按钮尺寸,弹窗不再出现按钮挤压

MemTidy 2.2

随本版本一起更新 MemTidy.exe:

  • 任务栏图标与 Alt+Tab 恢复正常
  • 右上角齿轮可调玻璃透明度(0–100),设置写入 %APPDATA%\MemTidy\settings.json 持久化
  • 清理待机内存前自动启用 SeProfileSingleProcessPrivilege
  • UAC 点"否"不再导致程序窗口消失

升级

pip install -U glass-ui==0.1.3

glass-ui v0.1.1 — 修复弹窗失效,新增玻璃透明度设置

Choose a tag to compare

@jiyihao jiyihao released this 25 Oct 05:41

修复

1. 标题栏 ? 和「结束选中进程」点了毫无反应

根因:打包 exe 的那份代码里,GlassEngine 缺 dialog_plate 方法,而
show_about() / ask() / info() 全都要调它。每次点击都抛 AttributeError,
又因为打包成无控制台模式,异常没有任何地方输出——用户看到的就是按钮彻底是死的。

修法不是补这个方法,而是删掉重复代码:项目里原本有两份 memtidy
(一份独立版打包成 exe,一份库版在仓库里),抽库时只给库版补了这个方法,
独立版一直漏着。现在独立版已废弃,exe 只从仓库里的 examples/memtidy 打包。

2. 「清理待机内存」必定失败,报状态码 -1073741727

-1073741727 = 0xC0000061 = STATUS_PRIVILEGE_NOT_HELD。

清空待机内存列表要调 NtSetSystemInformation,它需要
SeProfileSingleProcessPrivilege。这个特权即使对管理员令牌也是「存在但未启用」,
必须用 AdjustTokenPrivileges 显式打开。原代码完全没做,所以谁来点都失败。

有个坑值得记:AdjustTokenPrivileges 在一个特权都没分配成功时照样返回 TRUE,
只在 GetLastError() 里留下 ERROR_NOT_ALL_ASSIGNED (1300)。只看返回值会把失败
当成功。现在两处都查,并把失败原因细分成「非管理员 / 特权被策略限制 / 系统调用出错」。

3. 进程列表表头有数字、表体一行都没有

GlassTable.delete() 内部会重绘,insert() 不会。于是「先清空、再批量插入」
之后画布永久停在空白态,要等鼠标划过表格或窗口重建,行才会突然冒出来。

这同时是「结束进程没反应」的第二层原因:表格空白 → 选不中任何行 → 走提示分支 →
而那个提示弹窗本身又是坏的。

4. 点 UAC「否」程序会自己消失

relaunch_as_admin() 不看 ShellExecuteW 的返回值,无条件当成功。用户拒绝提权后
程序照样执行关闭流程,窗口直接消失且什么都没做。现在只有真正提权成功才关闭自己,
失败会明确告诉用户是「取消了」还是「被拒绝」,并提示可以右键手动以管理员身份运行。

顺带修了脚本方式运行时提权重启参数为空的问题(只会拉起一个裸解释器)。

新功能:玻璃透明度设置

标题栏新增齿轮按钮,点开可拖动滑块调节界面玻璃强度。

  • 100% = 最通透(能看清后方桌面),0% = 最磨砂
  • 拖动时实时预览,松手才重建背景(重建要抓屏 + 高斯模糊,每帧做会卡)
  • 设置存 %APPDATA%\MemTidy\settings.json,下次启动自动读回
  • 默认 74% 下渲染与旧版逐像素一致(729120 像素零差异),加了设置不会改变原有观感

库层新增 GlassSlider 控件(圆角轨道 + 渐变填充 + 圆形滑块头,全 PIL 渲染),
引擎新增 opacity_to_veil() / set_opacity(),语义换算见 README。

附件

  • MemTidy.exe — 单文件免安装。清理待机内存需要管理员权限(右键 → 以管理员身份运行)
  • 界面预览.png — 界面截图

安装

pip install glass-ui==0.1.1

MIT License.

glass-ui v0.1.0 — 首个版本

Choose a tag to compare

@jiyihao jiyihao released this 25 Oct 03:56

glass-ui 0.1.0

给 tkinter 的液态玻璃界面层。抓取窗口后方的真实桌面 → 高斯模糊 → 调色 → 合成卡片/描边/按钮底面 → 铺成 Canvas 背景,再配一套完全自绘的控件。

透出来的是真实桌面内容,不是渐变模拟。

包含内容

  • glass_ui/ 八个模块:engine / window / widgets / shapes / theme / win / compat
  • examples/dashboard.py — 最小可跑示例(900×640)
  • examples/memtidy/ — 完整落地案例:内存整理工具 MemTidy
  • docs/PITFALLS.md — 17 条踩坑记录(症状 → 根因 → 解法)

附件

  • MemTidy.exe — 用本库写的内存整理工具,单文件免安装,双击即可运行(需要管理员权限才能结束进程)

安装

git clone https://github.com/jiyihao/glass-ui.git
cd glass-ui
pip install -e .

环境要求

Windows(用到 Win32 接口)、Python 3.9+、Pillow 9+。没有 Pillow 时不会崩,自动退化成纯色直角界面。

已知限制

  • 仅 Windows。抓屏、圆角裁剪、模糊都建立在 Win32 + BitBlt 上
  • 窗口移动时需要重建背景,快速拖动会有轻微延迟
  • 无法排除「其他玻璃窗口」在后方造成的套娃,已用 WDA_EXCLUDEFROMCAPTURE 规避常规场景

MIT License.