LunaTranslator OCR 模式窗口绑定指南:让截图与翻译窗口彻底解耦
【免费下载链接】LunaTranslator视觉小说翻译器 / Visual Novel Translator项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator
LunaTranslator 的 OCR 模式允许直接读取任意游戏画面中的文本,但传统 OCR 翻译最令人头疼的问题就是「游戏窗口、翻译窗口、截图区域」三者之间的位置纠缠。本指南围绕 LunaTranslator 的绑定窗口功能,讲解如何一键将 OCR 截图区域锁定到指定游戏窗口,实现"翻译窗口随便放、游戏窗口随便移、被遮挡也能准确截图"的稳定体验,并顺带梳理该功能带来的游戏截图、游玩时间统计、Magpie 缩放、游戏专属个性化配置等一系列联动能力,帮助你彻底摆脱手工调整 OCR 范围框的烦恼。
痛点:为什么 OCR 模式下"对位置"如此折磨人
在使用其他 OCR 翻译软件时,用户经常需要时刻留意游戏窗口与翻译窗口的相对位置:
- 翻译窗口与截图区域相交:翻译窗口一旦压住截图范围,截图内容就会包含翻译结果,导致 OCR 结果反复横跳、激烈变化,翻译文本不断抖动;
- 游戏窗口切到后台:当游戏窗口被其他窗口(浏览器、聊天工具等)遮挡或切到后台时,截图会误取遮挡窗口的画面,翻译随即失效。
这两种情况都要求用户频繁手动调整窗口布局,体验非常割裂。LunaTranslator 的绑定窗口设置正是为了根治这一痛点而设计。
三步完成窗口绑定
绑定操作非常直观:
- 在 LunaTranslator 工具栏中点击绑定窗口(Bind Window)按钮;
- 随后点击目标游戏窗口(点击游戏画面任意位置即可);
- 绑定成功后,绑定窗口按钮会变为粉色,表示已成功绑定游戏窗口。
从源码看,这一交互链路由工具栏按钮、鼠标拾取与句柄写入三个环节组成:
- 工具栏按钮定义位于 gui/translatorUI.py:按钮名为
bindwindow,点击时发射bindcropwindow_signal信号,按钮的着色状态由isbindedwindow标志驱动(即"变粉"的本质); - 鼠标拾取逻辑在 myutils/hwnd.py 的
mouseselectwindow:它循环检测鼠标左键按下事件,随后通过WindowFromPoint取得鼠标所指窗口,再用GetAncestor取到顶层窗口句柄(HWND)与其所属进程 PID,回调给界面层; - 界面层回调 bindcropwindowcallback 会把句柄写入全局状态
gobject.base.hwnd(若拾取到的是 LunaTranslator 自身窗口则置空,避免自绑定)。
整个过程约等于"点按钮 → 点游戏 → 变粉",无需任何额外配置。
绑定后的两大核心变化
绑定成功后,OCR 模式的行为会发生两个关键变化,这也是该功能价值最集中的体现:
1. 截图只截游戏窗口本身
绑定后,截图将仅针对游戏窗口进行,不会截取任何其他非游戏窗口。由此带来两个直接收益:
- 翻译窗口可以随意摆放:即使翻译窗口与截图区域相交,也不会再进入截图画面,翻译内容不会因为"自己截到自己"而激烈变化;
- 游戏窗口被遮挡也能正确截图:当游戏窗口被其他窗口覆盖或切到后台时,截图依然只截取游戏窗口本身,而不是截取遮挡窗口。
这一行为的实现依据在 textio/textsource/ocrtext.py:OCR 区域的截图函数imageCutEx会以self.ref.hwnd(即绑定的游戏窗口句柄)为基准进行裁剪,配合 myutils/hwnd.py 中grabwindow使用的NativeUtils.GdiGrabWindow(hwnd)/WinRT.capture_window(hwnd)等底层窗口捕获接口,直接从指定窗口句柄取图,因此与"屏幕上此刻显示什么"无关——这正是"只截游戏、不截遮挡"的技术根因。
2. OCR 区域随游戏窗口同步移动
绑定后,当游戏窗口移动时,OCR 区域会跟随游戏窗口同步移动。也就是说:
- 移动游戏窗口时不再需要手动拖动 OCR 范围框;
- 尤其当你隐藏了范围框时,也无需再经历"显示范围框 → 移动 → 再隐藏"的繁琐流程。
从源码看,这一联动体现在 gui/rangeselect.py 的traceoffset逻辑:当 OCR 范围框需要随窗口移动时,它会读取gobject.base.hwnd(绑定窗口句柄),并通过MonitorFromWindow校验游戏窗口与范围框是否处于同一显示器,从而保证范围框只在自己的屏幕内合理跟踪,不会出现跨屏错位的异常行为。相关的跟踪信号由 textio/textsource/ocrtext.py 统一分发给每个 OCR 区域管理器。
绑定窗口的额外联动收益
除了解决截图与移动两大核心痛点,绑定游戏窗口还会自动带来以下四类附加能力:
1. 游戏截图功能更精准
LunaTranslator 工具栏的"截图"(grabwindow)功能在绑定窗口后,可以直接针对游戏窗口句柄进行截图,而非依赖前景窗口判断,因此无论游戏是否处于前台,都能稳定截取到准确的游戏画面。相关实现见 myutils/hwnd.py。
2. 游玩时间追踪更准确
绑定窗口后,游玩时间统计会把绑定的游戏进程纳入统计范围。在 myutils/somedatabase.py 的stricttraceexe中,除了取当前前台窗口的进程外,还会读取gobject.base.hwnd对应的游戏进程,并将二者一并纳入时间追踪与游戏 UID 的匹配,保证"游戏挂在后台、Luna 在前台"时依然能准确记录游玩时间。
3. 使用内置 Magpie 或调用外部 Magpie
绑定窗口是调用 Magpie 进行游戏缩放放大的前提:用户既可以使用 LunaTranslator 内置的 Magpie 配置,也可以通过工具按钮唤起自己单独下载的 Magpie。仓库中的相关支撑包括:
- myutils/magpie_builtin.py 提供内置 Magpie 配置管理(
MagpieConfig); - gui/gamemanager/setting.py 提供按游戏配置"窗口缩放"的界面入口;
- gui/setting/display_scale.py 负责读写 Magpie 配置文件中的缩放模式等参数;
- myutils/hwnd.py 的
grabwindow会先探测 Magpie 的缩放窗口(Window_Magpie_*类窗口)并直接对其截图,实现"放大后的画面也能准确截取"。
4. 获取游戏位置与内部 ID,实现游戏专属个性化设置
绑定窗口后,LunaTranslator 可以从窗口句柄反查出游戏可执行文件路径,进而定位游戏在软件内部的唯一 ID(gameuid),并自动切换到该游戏的专属配置。其核心逻辑在 LunaTranslator.py 的hwnd属性 setter 中:
- 通过
windows.GetWindowThreadProcessId(__hwnd)取得游戏进程 PID; - 若开启了
autoswitchgameuid,则通过findgameuidofpath(windows.GetProcessFileName(_pid))自动匹配游戏内部 ID 并切换gameuid; - 绑定后还可调用
NativeUtils.MonitorPidVolume对游戏进程做静音等进程级控制; - 若绑定被解除(句柄置空),
isbindedwindow复位、按钮颜色恢复,并在开启自动切换时将gameuid归零。
基于此机制,用户可以对特定游戏进行个性化的设置,包括专用于该游戏的语言、语音合成、翻译优化、文本处理、Anki(背单词同步)等配置。换言之,同一套 LunaTranslator 可以针对不同游戏自动加载不同的翻译方案,绑定窗口正是这一切的入口。
实用小结与注意事项
- 操作路径:工具栏「绑定窗口」按钮 → 点击游戏窗口 → 按钮变粉即成功;取消绑定只需再次点击按钮或重启文本源。
- 核心收益:翻译窗口与截图区域彻底解耦(可随意摆放、不互相干扰);游戏窗口移动时 OCR 区域自动跟随;被遮挡/后台时仍只截游戏窗口。
- 联动能力:更准确的游戏截图、更准确的游玩时间统计、内置/外部 Magpie 缩放调用,以及基于游戏内部 ID 的翻译方案自动切换与个性化设置。
- 适用前提:绑定窗口依赖 Windows 窗口句柄机制,适用于具有独立窗口的桌面游戏;在使用前请确认 OCR 模式已启用并已配置好 OCR 引擎(可参考 OCR 引擎配置 与 OCR 参数说明)。
- 界面操作细节:更多工具栏按钮的功能说明可参阅 全部工具按钮,快捷键绑定可参考 快捷键设置。
绑定窗口是 LunaTranslator OCR 使用体验中"投入最小、收益最大"的一个开关:一次点击,从此不再需要为截图区域和窗口位置反复较劲。
【免费下载链接】LunaTranslator视觉小说翻译器 / Visual Novel Translator项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考