【问题标题】:AutoHotkey key shortcuts with disabling Alt key禁用 Alt 键的 AutoHotkey 快捷键
【发布时间】:2021-06-20 22:31:21
【问题描述】:

设置

Windows 10(当前版本)上的 AutoHotkey v 1.1.32.00,采用美式键盘布局。

目标

通过使用带有右 Alt 键 = RAlt 的快捷键来使用不存在的键扩展美式键盘布局。因此,RAlt 键应完全禁用,仅用于新的快捷方式(左 Alt 键 = LAlt 仍用于程序菜单跳转和类似操作)。
例子:

  • RAlta 按在一起会打印出ä(一个特殊的德国字母)
  • RAlty 按在一起会打印出¥(日元)。

第一次工作尝试

#MenuMaskKey vkFF

key_map_lower := {a: "ä", y: "¥"}

RAlt::
for key in key_map_lower {
    Hotkey, $%key%, hotkey_label_lower, On
}
return

RAlt Up::
for key in key_map_lower {
    Hotkey, $%key%, Off
}
return

hotkey_label_lower:
Send, % key_map_lower[SubStr(A_ThisHotkey, 2)]
return

这很好,到目前为止没有问题。

问题

RAlt+a=ä 组合只打印小写的德国特殊字母,但也有一个等价的大写字母。因此,需要一个新规则,如下所示:RAlt+Shift+a=Ä

我的尝试:

#MenuMaskKey vkFF

; lowercase letters

key_map_lower := {a: "ä", y: "¥"}

RAlt::
for key in key_map_lower {
    Hotkey, $%key%, hotkey_label_lower, On
}
return

RAlt Up::
for key in key_map_lower {
    Hotkey, $%key%, Off
}
return

hotkey_label_lower:
Send, % key_map_lower[SubStr(A_ThisHotkey, 2)]
return

; capital/uppercase letters

key_map_upper := {a: "Ä"}

RAlt & +::
for key in key_map_upper {
    Hotkey, $%key%, hotkey_label_upper, On
}
return

RAlt & + Up::
for key in key_map_upper {
    Hotkey, $%key%, Off
}
return

hotkey_label_upper:
Send, % key_map_upper[SubStr(A_ThisHotkey, 2)]
return

但这仅适用于以前的小写字母。大写字母不出现。

另一种尝试

RAlt::
Hotkey, a, label_a, On
Hotkey, y, label_y, On
Hotkey, +a, label_a_, On
return

RAlt Up::
Hotkey, a, label_a, Off
Hotkey, y, label_y, Off
Hotkey, +a, label_a_, Off
return

label_a:
Send, ä
return

label_y:
Send, ¥
return

label_a_:
Send, Ä
return

这适用于小写和大写。 但是只有在 Shift 之前按 RAlt 时,大写才有效。当先按 Shift 再按 RAlt 时,窗口菜单将获得焦点。

问题

怎么可能

  1. 修复了第二个脚本,以便先按 Shift 还是 RAlt 并不重要?
  2. 或者如何修复第一个脚本才能正常工作,同时忽略 RAlt 和 Shift 的顺序?

我猜第一次尝试更紧凑,更健壮,因为冗余更少,行也更少。

(另外我认为这两种尝试在代码中都没有任何美感,但是在第一次尝试中将小写和大写组合在一个数据结构中只会导致更多问题。通过这种加倍,至少小写字母可以工作。但我我也感谢所有的优化。)

其他问题

我也想映射 RAlt+`=°
这在第二次尝试中是可能的,因为标签是手动分配的。但是第一次尝试这是不可能的。所以这是第一次尝试的下一个问题。

附加

在某些来源中,他们使用>! 代替RAlt,但也没有运气。

来源

autohotkey.com 上的原始来源以及关于 RAlt 组合键 here 的一些讨论。

【问题讨论】:

  • 我什至无法让你的“工作”脚本工作,特殊字符弄乱了 key_map_lower。即 IsObject(key_map_lower) 对我来说是 0。你知道你的 ahk 脚本是如何编码的吗? Notepad++ 说我使用的是 UTF-8。
  • 小写字母脚本对我来说工作正常,ahk 文件是带有 BOM 的 UTF-8。它直接运行(没有#include通过其他脚本,因为这也给我带来了一些麻烦)。
  • 我添加了第二次尝试,甚至不那么漂亮,但使用了大写和小写字母。但是新问题:按钮按下的顺序现在很重要。首先按 RAlt 然后按 Shift 将起作用,但反之则不行。
  • 你的新尝试确实对我有用,现在我可以试试看能否找到解决方案。

标签: windows autohotkey shortcut


【解决方案1】:

这对您的目的有用吗?

*RAlt::
Hotkey, *a, label_a, On
Hotkey, y, label_y, On
return

*RAlt Up::
Hotkey, *a, label_a, Off
Hotkey, y, label_y, Off
return

label_a:
if(GetKeyState("Shift", "P")) {
    Send, Ä
} else {
    Send, ä
}
return

label_y:
Send, ¥
return

'*',通配符,即使在额外的修饰符被按住时也可以触发热键。它检查是否按下了 shift 的标签内部。

【讨论】:

  • 工作完美无缺,非常感谢 :) 通配符起到了作用,相关文档解释了很多有趣的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多