workbuddy 高 dpi 问题需三步解决:1. 启动前设环境变量 electron_high_dpi_scale_factor=1 和 winit_hidpi_factor=1;2. package.json 中 build.win.permonitordpiaware 设为 true 并配置 app.manifest 启用 permonitorv2;3. 主进程监听 screen 缩放因子并透传至渲染层动态调整样式。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

WorkBuddy 启动时 UI 被压缩或模糊,怎么强制启用高 DPI 缩放?
WorkBuddy 基于 Electron 构建,默认不自动适配 Windows 高分屏(如 200% 缩放),导致界面文字发虚、按钮错位、图标糊成一片。根本原因是 Electron 进程未声明 DPI 感知模式,系统 fallback 到位图拉伸渲染。
解决方式不是改缩放百分比,而是让主进程和渲染进程都声明为 per-monitor-high-dpi-aware。需在启动前通过环境变量干预:
- Windows 下启动前设置:
set ELECTRON_HIGH_DPI_SCALE_FACTOR=1(禁用 Electron 内置缩放逻辑) - 同时必须加:
set WINIT_HIDPI_FACTOR=1(修复底层 winit 窗口缩放) - 最关键一步:在
package.json的build.win.perMonitorDpiAware设为true(Electron Builder 打包时生效)
打包后安装版仍不缩放,检查 manifest 和 app.manifest 是否被忽略?
即使设置了 perMonitorDpiAware,Windows 10/11 仍可能因缺失应用清单(manifest)而降级为系统 DPI 感知模式。Electron Builder 默认不注入 manifest,需手动补全。
创建 build/app.manifest 文件,内容必须包含以下关键节(注意版本号与你的 Electron 版本匹配):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestversion="1.0"><application><windowssettings><dpiaware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiaware><dpiawareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">permonitorv2</dpiawareness></windowssettings></application></assembly>
然后在 package.json 的 build.win.manifest 字段指向它,否则打包工具会跳过该文件。
用户手动修改缩放后界面错位,如何让 WorkBuddy 读取当前系统缩放值?
WorkBuddy 无法仅靠 CSS transform: scale() 正确响应动态缩放切换(比如用户从 150% 改为 200%),必须在主进程获取真实 DPI 因子并透传给渲染层。
WorkBuddy 桌宠工厂 —— 给一张角色图、一个 codex.pet 链接、一条 codex-pets.net 下载 URL、或一份现成的精灵表,就能自动创建一只可联动 WorkBuddy 状态的桌面宠物。当用户说"创建桌宠"、"做一只桌宠"、"用这张图做桌宠"、"从 codex.pet 安装桌宠"、"导入 codex 桌宠 XX"、"装一下 codex-pets.net 上的 XX&quo
在主进程(main.js)中使用 Electron 的 screen 模块实时监听:
- 调用
screen.getPrimaryDisplay().scaleFactor获取当前缩放值(如 2 表示 200%) - 通过
webContents.send('dpi-change', scaleFactor)推送至渲染进程 - 渲染进程监听后,用
document.documentElement.style.fontSize或 CSS 自定义属性动态调整根字号,避免硬编码zoom
注意:不能依赖 window.devicePixelRatio —— 它在未启用 DPI 感知的窗口中始终返回 1。
macOS 上字体发虚、按钮偏小,和 Windows 设置逻辑一样吗?
不一样。macOS 不用 manifest 或 perMonitorDpiAware,但需确保 Electron 版本 ≥ 24(旧版对 Retina 渲染有缺陷),且禁用 --disable-gpu 启动参数(该参数会绕过 Metal 渲染路径,导致 subpixel 渲染失效)。
实操要点:
- 确认打包时
build.mac.entitlements包含com.apple.security.app-sandbox为false(沙盒会限制高 DPI 渲染权限) - 启动脚本里删掉所有
--force-device-scale-factor参数 —— macOS 应完全交由系统控制 - 检查是否误设了
app.commandLine.appendSwitch('high-dpi-support', 'false'),这会直接关闭 HiDPI 支持
最易忽略的是:开发时用 electron . 启动不会加载 build 配置,必须用打包后的 app 测试,否则 macOS 下永远看不到真实缩放效果。










