禁用 Alt 键的 AutoHotkey 快捷键

AutoHotkey key shortcuts with disabling Alt key

设置

AutoHotkey v 1.1.32.00 on Windows 10(当前版本),美式键盘布局。

目标

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

第一次工作尝试

#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 时,window 菜单获得焦点。

问题

怎么可能

  1. 修复第二个脚本,这样先按 Shift 还是按 RAlt 就不重要了?
  2. 或者如何修复第一个脚本以便工作并且忽略 RAlt 和 Shift 的顺序?

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

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

补充问题

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

额外

在某些来源中,他们使用 >! 作为 RAlt,但也没有成功。

来源

autohotkey.com and some discussions about RAlt key combinations here 上的原始来源。

这对您有用吗?

*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。