【问题标题】:Some actions doesn't work properly in non-English keyboard layout某些操作在非英语键盘布局中无法正常工作
【发布时间】:2017-05-07 23:28:33
【问题描述】:

谁能解释为什么某些 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) 为什么某些命令在两种布局中都能正常工作

  • Msgbox, Test
  • SendInput, !{Up}
  • SendInput, a

但其他命令仅适用于英文版式 (SendInput, ^a)?

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


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

【问题讨论】:

  • 您没有提到,如果在乌克兰布局中手动按 Ctrl+a 有效。另外请指定windows版本。我已经改变了我的键盘很多(日语->德语)并使用发送而不是发送输入。我仍然遇到一些软件的问题。 Windows 10 的问题更严重
  • 我用的是Win7。当然,如果我手动按 Ctrl-a,它可以正常工作。例如,我可以在记事本中输入一些文本,然后按 Ctrl-a,它将选择所有文本。
  • 有点杂乱无章,但如果您发现自己仅限于 VK/SC 代码,则可以依靠一小段代码在运行时查找 VK/SC,这应该可以解释次它偏离预期的 VK/SC。请参阅此处的文档:autohotkey.com/docs/commands/GetKey.htm
  • @DavidMetcalfe 似乎对此类问题非常有用。非常感谢!
  • 在早于 v1.1.27 的 AutoHotkey 版本上(不需要这些变通办法),如果 default 键盘布局不包含“一个人物。对于 ASCII 字母 'a' - 'z',您需要的是大写版本的序数值:Ord("A")Asc("A")。 Microsoft 将这些 VK 代码定义为对应于 ASCII 字母,因此尽管它们的物理位置可能会因布局而异,但它们应该始终是正确的。

标签: autohotkey


【解决方案1】:

SendInput a 通过模拟相应的击键发送字符“a”。但是,在乌克兰布局中,没有与“a”对应的击键,因此它使用回退方法发送字符,例如用于发送{U+0061} 的方法。这方面的详细信息最近已添加到Characters vs. keys 下的文档中。

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

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

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

关于问题“a)”:

  • Msgbox, Test 效果很好,因为它与键盘布局无关。
  • SendInput, !{Up} 效果很好,因为“向上”和其他命名键(长于一个字符)始终对应于相同的 VK 或扫描码。在这种情况下,扫描码用于区分 Up 和 NumpadUp,它们共享相同的 VK 代码。
  • SendInput, a 运行良好,因为它是通过回退方法发送的,这也是 SendInput, ^a 运行良好的原因。如果“a”始终等同于 {vk41}SendInput, a 会在乌克兰布局中产生错误的字符。

...和问题“b)”:

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

【讨论】:

  • 哇,Lexikos,是你!从你那里得到答案就像从国王那里得到听众:-) 非常感谢你创建和开发 AutoHotkey!
猜你喜欢
  • 1970-01-01
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 2018-04-02
相关资源
最近更新 更多