【发布时间】: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, TestSendInput, !{Up}SendInput, a
但其他命令仅适用于英文版式 (SendInput, ^a)?
b) 这里有其他使用 sc/vk 代码的替代方法吗?
我忘了提。我还测试了Send 和SendPlay,它们并没有改变任何东西。我的脚本也保存在带有 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