某些操作在非英语键盘布局中无法正常工作

Some actions doesn't work properly in non-English keyboard layout

谁能解释为什么某些 AHK 操作在非英语键盘布局中不起作用?

我正在使用英语和乌克兰语键盘布局。

这在以下两个方面都非常有效:

F1:: MsgBox, Test
F1:: SendInput, !{Up} ; For convenience, should be tested in Windows Explorer
F1:: SendInput, a     ; Could be tested in Notepad, for example

但这只适用于英文布局:

F1:: SendInput, ^a
F1:: SendInput, {Ctrl Down}a{Ctrl Up}
F1:: SendInput, ^{U+0061} ; Doesn't work even in English layout

如果我将键盘切换到乌克兰布局,而不是使用 Ctrl-A,我将只使用 "a"(没有 Control)。

正如我所发现的,这个问题可以用 vk/sc 代码解决:

F1:: SendInput, ^{vk41sc01E} ; Works in both English and Ukrainian layouts

但是,我不是 vk/sc 代码的忠实粉丝,因为我听说它有时会因键盘硬件而有所不同。

另外,很难理解这个限制的逻辑。嗯,我明白有时候我们应该用代码定义热键,即

vk00sc000:: Do something

但为什么我们在 SendInput 之后被迫使用 vk/sc 代码


所以有两个问题。

a) 为什么有些命令在两种布局中都运行良好

但另一个命令仅适用于英文布局 (SendInput, ^a) ?

b) 这里有使用 sc/vk 代码的替代方法吗?


忘记说了。我还测试了 SendSendPlay,它们没有任何改变。另外我的脚本保存在带有 BOM 的 UTF8 中,所以我知道我们不应该只使用 UTF8。

SendInput a通过模拟相应的击键发送字符"a"。但是,在乌克兰布局上,没有"a"对应的击键,所以它使用回退方式发送字符,比如用来发送[=11=的方法].这方面的详细信息最近已添加到 Characters vs. keys.

下的文档中

键盘快捷键(或热键)通常设计用于对修饰符状态和 虚拟键代码 的组合做出反应,例如 0x41 ('A')。由于回退方法不使用预期的虚拟键代码,因此它们不会触发键盘快捷键。

将回退方法发送的字符与修饰键组合通常没有意义,因此 AutoHotkey v1.1.27 更改了 'a' - 'z' 字符的行为(当与修饰键组合时) 返回到相应的虚拟键码(相当于它们的大写 ASCII 对应物),如果它们不存在于键盘布局中。

所以换句话说,它应该只适用于 AutoHotkey v1.1.27+

关于问题"a)":

  • Msgbox, Test 效果很好,因为它与键盘布局无关。
  • SendInput, !{Up} 效果很好,因为 "Up" 和其他命名键(长于一个字符)总是对应于相同的 VK 或扫描码。本例使用扫码区分Up和NumpadUp,两者VK码相同
  • SendInput, a 效果很好,因为它是通过回退方法发送的,这也是 SendInput, ^a 没有 效果好的原因。如果 "a" 始终等同于 {vk41}SendInput, a 将在乌克兰语布局中产生错误的字符。

...和问题 "b)":

  • AutoHotkey v1.1.27之前的版本,必须使用VK码(或SC码)。但是,您可以通过将大写 ASCII 字符传递给 Ord(使代码更冗长)来避免神秘数字:Send % "^{" Format("vk{:x}", Ord("A")) "}"。这可以通过创建一个自定义函数来缩写,将字母转换为相应的虚拟键码。