Alt-Tab 卡键修复 封面

Alt-Tab 卡键修复

上古卷轴5:天际特别版Bug修复

一个简单的 CommonlibSSE-NG 插件,用于修复在游戏中 Alt-Tab 切入切出时出现的按键卡住问题。

前置 Mod

详情

这是什么?

这是一个 SKSE 插件,用于修复《上古卷轴5:天际》(Skyrim) 中如今臭名昭著的按键卡住问题。

当使用那些通过 imgui 覆盖层显示设置的 mod(例如 Community Shaders)时,这个 bug 会变得尤为明显。由于 imgui 处理输入的方式,按键卡住会导致 imgui 覆盖层在其所有可见控件之间快速循环切换,直到你手动按下出问题的那颗按键来修复它。

按键为什么会卡住:

Skyrim 的键盘使用缓冲式 DirectInput,这意味着游戏只能收到按键按下和按键抬起事件,而无法获知任意时刻键盘的实际状态。因此,如果某次按键抬起事件被漏掉,游戏就无从得知那颗键曾经被松开过。

这就是切出窗口时会发生的情况。每当游戏窗口获得或失去焦点时,游戏都会重置所有设备的输入状态,但在重置时它实际上并不会释放任何按键。因此,游戏自身的按键状态以及任何监听输入事件的 mod 都收不到抬起事件,从而一直认为该键处于按住状态。

修复方式:

  • 在每次输入设备更新(键盘、鼠标和手柄)之后,插件会检查那些游戏仍认为被按住、但设备已不再报告按下的按键,并以游戏处理正常按键抬起的方式释放它们。这样游戏本身、其按键状态以及所有监听输入事件的 mod 都能看到该键被释放。

  • 每当游戏重置键盘时,DirectInput 缓冲区中尚未处理的键盘事件都会被清空,因此残留的按键不会再被处理。

  • 如果 DirectInput 报告它丢失了输入事件(失去对设备的访问权限或其缓冲区溢出),键盘状态同样会被重置。

根据我本人做过的所有测试,我已经无法再复现这个 bug,无论是游戏本身,还是所有带有 imgui 覆盖层的热门 mod,例如 CS、OAR、IED、SKSEMenuFramework 等等。

Compatibility

应适用于从 1.5.97 (SE) 到 1.7.104 (AE) 的所有游戏版本(仅测试过 1.5.97、1.6.1170 和 1.7.104,但介于其间的所有版本理论上也应该可用)。

不支持 Skyrim VR。

实验性功能

1.3 版本新增了 2 个实验性补丁,默认处于禁用状态:

注意:这些补丁假设你以窗口化/无边框模式运行游戏!

  • 一个阻止游戏在启动期间抢占窗口焦点的补丁。该补丁修改了游戏的窗口创建流程,使游戏窗口创建时不会获取焦点。这个补丁的想法源自一个个人困扰:在等待游戏加载到主菜单时,我在做别的事情,焦点却会随机被它抢走。

  • 一个允许在游戏内使用 Windows 截图工具快捷键 [Win+Shift+S] 的补丁。通常即使安装了像 media keys fix 这样的 mod,Skyrim 也会吞掉任何 Windows 快捷键。该补丁通过拦截 Win+Shift+S 组合键并手动启动截图工具,从而让截图工具可以使用。

源代码可以在这里找到。