十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

pi-computer-use Windows DPI感知与缩放:scaleFactor如何计算

pi-computer-use Windows DPI感知与缩放:scaleFactor如何计算 pi-computer-use Windows DPI感知与缩放scaleFactor如何计算【免费下载链接】pi-computer-useLet Pi control your apps on MacOS Windows项目地址: https://gitcode.com/GitHub_Trending/pi/pi-computer-usepi-computer-use是开源项目 Pi 的电脑控制扩展Let Pi control your apps on MacOS Windows让 AI 助手 Pi 能看见并操作你电脑上的窗口。在 Windows 高分屏上它靠一个关键数值scaleFactor缩放因子来对齐窗口坐标和截图像素避免 AI 点击时打偏。本文用大白话讲清楚 Windows DPI 感知是怎么开启的、scaleFactor 是怎么算出来的、以及它为什么对 AI 精准点击如此重要。一、先搞懂DPI 感知是什么问题Windows 高分屏125%、150%、200% 缩放会让物理像素和逻辑点screen points不一致UIA / HWND 报告的位置是 DPI 感知后的逻辑点截图像素是真实的物理像素。如果 AI 拿逻辑点直接当像素去点鼠标在 150% 缩放上会偏 50%。pi-computer-use 的 Windows 辅助程序windows-bridge在启动第一行就声明自己是每显示器 V2 DPI 感知进程这样系统会把每个窗口真实的缩放交给它而不是粗暴地把整个画面拉伸。相关代码DPI 感知声明set_dpi_awareness()SetProcessDpiAwarenessContext→PER_MONITOR_AWARE_V2官方说明docs/windows-bridge.md 明确写道The helper declares per-monitor-v2 DPI awareness at startup and reportsscaleFactor GetDpiForWindow(hwnd) / 96.二、scaleFactor 是如何计算的 核心公式只有一句话scaleFactor 该窗口所在显示器的 DPI ÷ 9696 DPI 是 Windows 的100% 缩放基准值。计算发生在枚举每个窗口时对窗口句柄调用 Win32 APIGetDpiForWindow(hwnd)拿到这个窗口实际所在显示器的 DPI例如 150% 缩放的 1080p 外接屏会返回 144除以 96.0 得到缩放因子如果返回值 ≤ 0API 异常兜底直接回退为1.0保证数据永远是合法的正数。let dpi GetDpiForWindow(hwnd); let scale_factor if dpi 0 { dpi as f64 / 96.0 } else { 1.0 };源码位置window.rs 枚举窗口随后scaleFactor被写进每个窗口的元数据第 441 行并在look观察响应中原样带回给 TypeScript 层main.rs。常见缩放对应的 scaleFactor 一览系统缩放设置GetDpiForWindow 返回值scaleFactor100%961.0125%1201.25150%1441.5175%1681.75200%1922.0多显示器混插时主屏 100%、副屏 200%每个窗口的 scaleFactor 各自独立——这正是Per-Monitor V2比老式全局 DPI 感知聪明的地方把窗口拖到哪块屏就用哪块屏的缩放。TypeScript 层还有一道保险丝辅助程序上报的数值到了 TypeScript 后端还会经过Math.max(1, ...)钳制缺失或非法时兜底为 1确保上层状态机拿到的永远是 ≥ 1 的合法因子解析入口src/platform/windows/backend.ts大纲构建src/outline.ts三、为什么要算它屏幕点 → 截图像素的换算 ⚙️这是整条链路里最关键的一步。AI 观察窗口时会得到两样东西数据单位来源元素坐标UIA/HWND 矩形逻辑点系统 UI 自动化接口截图物理像素GDI 捕获当截图尺寸和窗口逻辑尺寸不一致时高缩放下截图像素 逻辑点 × scaleFactormain.rs 的 outline 构建 会计算一个换算比sx 截图宽 / 窗口逻辑宽 // 通常 ≈ scaleFactor sy 截图高 / 窗口逻辑高然后把每个元素矩形从屏幕逻辑点平移到截图像素坐标像素x (元素屏幕x − 窗口x) × sx 像素y (元素屏幕y − 窗口y) × sy换算完之后AI 报出的坐标可以直接在截图上按图索骥点击、拖拽、滚动全部落在正确位置——这就是 scaleFactor 存在的意义让 AI 的眼睛和手用同一把尺子。四、相关文件速查表 内容路径DPI 感知声明Per-Monitor V2native/windows/bridge-rs/src/main.rsscaleFactor 计算与窗口枚举native/windows/bridge-rs/src/window.rslook 响应中回传 scaleFactornative/windows/bridge-rs/src/main.rs坐标换算点 → 像素native/windows/bridge-rs/src/main.rsTypeScript 端解析与钳制src/platform/windows/backend.tsWindows 桥协议文档docs/windows-bridge.md平台统一类型定义src/platform/types.ts五、常见疑问 FAQQ为什么用 GetDpiForWindow 而不是 GetDeviceCapsA前者按窗口当前所在显示器取 DPI天然支持多屏不同缩放后者只能取主屏或某个 DC 的 DPI多屏场景会出错。QscaleFactor 会为 0 或负数吗A不会。Rust 端对 API 失败兜底为 1.0TypeScript 端再经Math.max(1, …)二次钳制双重保险。Q菜单、弹窗等根窗口也带 scaleFactor 吗A带。所有根窗口/菜单/对话框/弹出层都走同一套枚举逻辑window.rs 中每个根都写入bounds与scaleFactor保证菜单点击同样精准。小结pi-computer-use 在 Windows 上的缩放处理可以浓缩成三步启动时声明 Per-Monitor V2 感知 → 对每个窗口用GetDpiForWindow / 96算出 scaleFactor → 用截图宽高与窗口逻辑宽高的比值把元素坐标换算成像素。这套设计让 AI 在 100%200% 任意缩放、多屏混插的环境下都能把鼠标准确地点到它看见的位置上。【免费下载链接】pi-computer-useLet Pi control your apps on MacOS Windows项目地址: https://gitcode.com/GitHub_Trending/pi/pi-computer-use创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表