|
中文输入修复(FR)v1.0.0 给 Fast Rendering(FR) 渲染线程下的 Starsector 窗口补上中文输入。 没有 FR 不会运行 工作原理- mod 加载后另起线程,按进程号找到类名为 LWJGL、客户区最大的顶层窗口(即 FR 的游戏窗口)。
- 用 SetWindowLongPtrW(GWLP_WNDPROC) 子类化窗口,原窗口过程照常链式调用。
- 收到 WM_IME_COMPOSITION 且带 GCS_RESULTSTR 时,用 ImmGetCompositionStringW 取出上屏字符串。
- 把字符串写入剪贴板,SetForegroundWindow 后模拟一次 Ctrl+V,再恢复剪贴板内容。
已知限制- 粘贴瞬间会短暂占用剪贴板(约 0.3 秒),随后恢复原内容;这 0.3 秒内如果别的程序写剪贴板,可能被覆盖。
- 依赖目标输入框支持 Ctrl+V 粘贴。Starsector 标准文本框、LunaLib 文本框通常支持;极少数自绘输入框若拦截 Ctrl+V 可能无效。
- 候选词窗口由输入法自己画(搜狗/微软拼音),本 mod 不做候选框。
- 仅 Windows;仅对 FR 创建的窗口生效。
- 游戏或 FR 大版本更新后,窗口线程模型或文本框行为可能变化,需要重新适配。
兼容性
跟其他中文输入mod冲突
许可证
本 mod 自己的代码以 Unlicense(公共领域)发布,见 LICENSE。 随包分发的 JNA 5.14.0 为 Apache-2.0 / LGPL-2.1 双许可,见 THIRD_PARTY.md。
以及一个不需要使用粘贴直接使用FR线程的补丁版本
中文输入独立补丁(Fast Rendering 专用)v1.0.0
这是什么一个只修中文输入的小补丁,给已经能正常开 Fast Rendering(FR)的 Starsector 用。 原理FR 把游戏窗口建在渲染线程 Thread-N-FR-Render 上,而 Windows 的输入法消息只会发到这个窗口线程。 本补丁做三件事: - 用 JNA 子类化真正的游戏窗口(不是 Swing 启动器),在渲染线程上处理 WM_IME_*;
- 从 WM_IME_COMPOSITION 里用 ImmGetCompositionStringW(GCS_RESULTSTR) 取出已确认的文字;
- 在 FR 的 com.genir.renderer.overrides.Sync.update(Z)V(游戏线程每帧调用)开头注入 ImeLayer.drain(),把文字写进当前获得焦点的 TextFieldAPI。
另外会在渲染线程做一次 COM STA 初始化(OleInitialize),避免搜狗等 TSF 输入法在 MSCTF.dll 里闪退。 安装确认 FR 已经能用:启动参数里有 -javaagent:fr.agent.jar,fr.jar 在 classpath 里。 把 ime-agent.jar 和 jna-5.14.0.jar 复制到 starsector-core\。 在启动参数文件(*.vmparams)里,紧跟 FR 的 -javaagent 之后加一行: -javaagent:ime-agent.jar启动游戏。
顺序很重要:fr.agent.jar 必须先加载,本补丁才能接管它建出来的窗口。 关闭 / 卸载- 临时关闭:加 -Dfixagent.imepoc=false;
- 完全卸载:删掉上面两行参数,删除 ime-agent.jar、jna-5.14.0.jar 即可。
日志starsector-core\fixagent-ime.log(UTF-8,单次运行最多 4 MB)。正常启动应看到:
[ime-poc-attach] imepoc starting, version=1.0.0 pid=...
[ime-poc-attach] subclassed hwnd=... oldProc=...
[Thread-6-FR-Render] wndproc msg=WM_IME_COMPOSITION ...
[Thread-6-FR-Render] RESULTSTR='你好' (queue=1)
[Thread-3] applied '你好' chars=2/2 ok=true text='你好'
控制台(-Dfixagent.imepoc.debug=true 时)还会打印 [imefix] sync drain hook: 1 等安装信息。 已知限制- 已确认的文字追加到文本框末尾,不是光标处;
- 候选框由输入法自己画,没有和输入框对齐;
- 只支持游戏标准的 TextFieldAPI 输入框,个别 mod 自绘的输入框可能不生效;
- 依赖 FR 的 Sync.update(Z)V,FR 大版本升级后可能失效,需要重新适配。
本补丁会做什么- 磁盘上:只新增 ime-agent.jar、jna-5.14.0.jar 和一行 -javaagent 参数;
- 运行时:通过 Java Agent 在内存里给 FR 的 Sync 和 TextFieldAPI 实现类插入少量字节码,不写回磁盘;
- 在渲染线程调用 OleInitialize / CoInitializeEx(STA);
- 不联网,不读写游戏目录以外的文件。
许可证- 本补丁代码:Unlicense(公共领域);
- JNA 5.14.0:Apache-2.0 / LGPL-2.1;
- 内含 ASM 9.1(BSD-3-Clause)的类文件。
补丁和mod使用一个就行,不要重复安装
|