某些操作在非英语键盘布局中无法正常工作
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) 为什么有些命令在两种布局中都运行良好
Msgbox, Test
SendInput, !{Up}
SendInput, a
但另一个命令仅适用于英文布局 (SendInput, ^a
) ?
b) 这里有使用 sc/vk 代码的替代方法吗?
忘记说了。我还测试了 Send
和 SendPlay
,它们没有任何改变。另外我的脚本保存在带有 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")) "}"
。这可以通过创建一个自定义函数来缩写,将字母转换为相应的虚拟键码。
谁能解释为什么某些 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 代码的替代方法吗?
忘记说了。我还测试了 Send
和 SendPlay
,它们没有任何改变。另外我的脚本保存在带有 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")) "}"
。这可以通过创建一个自定义函数来缩写,将字母转换为相应的虚拟键码。