A_MenuMaskKey

A_MenuMaskKey 是一个内置变量, 它控制使用哪个键来掩饰(屏蔽) Win 或 Alt 键松开事件.

A_MenuMaskKey 可用于获取或设置一个十六进制的字符串, 表示 vkNNscNNN 序列, 用于标识虚拟键码(NN) (NNN). 如果为空, 表示禁用屏蔽.

脚本也可以指定一个按键名称, vkNN 序列或 scNNN 序列, 在这种情况下, 通常 VK 或 SC 码被保留为零, 直到按键被发送, 然后自动确定. 指定 "vk00sc000" 可禁用屏蔽, 等同于赋值 "".

不管如何赋值, 如果启用, 返回的字符串总是 vkNNscNNN 序列, 如果禁用, 则是空值. 所有的 vkNNscNNN 序列和所有非零的 vkNN 或 scNNN 序列都是允许的, 但一些组合可能无法抑制菜单. 任何其他无效的键都会导致抛出 ValueError.

默认的设置为 vk11sc01D(左 Ctrl 键).

备注

掩饰键会自动发送, 以防止开始菜单或活动窗口的菜单栏在未预期的时间激活.

此变量可用于将掩饰键更改为具有较少副作用的键. 好的候选者是通常不会有效果的虚拟按键代码, 例如 vkE8, 微软的文档将其称为 "未定义的", 或 vkFF, 它被保留为 "没有映射"(一个没有功能的键). 某些值, 如 0 VK 和非 0 SC, 可能无法抑制开始菜单. 按键码不需要匹配按键的存在.

注意: Microsoft 可以随时为未指定的键码指定一个效果. 例如, vk07 曾经是未定义的并且可以安全使用, 但从 Windows 10 1909 开始, 它就被保留为打开游戏栏.

这个设置是全局的, 也就是说, 只需要指定一次就可以影响整个脚本的行为.

Hotkeys: 如果是使用键盘钩子或鼠标钩子实现的热键, 则最终的按键可能对活动窗口和系统是不可见的. 如果系统 检测到 Win 或 Alt 按下和松开, 而期间没有其他键按下, 通常会激活一个菜单. 为防止这种情况发生, 键盘或鼠标钩子可能会自动发送掩饰键.

如果满足以下所有条件, 则按下钩子热键将导致下一个 Alt 或 Win 的松开被屏蔽(发送掩饰键):

如果没有安装键盘钩子, 鼠标热键会立即发送掩饰键.

带有颚化符修饰键的热键并不会阻止按键的原有功能, 因此不会引发掩饰键. 像 ~#a:: 这样的热键仍然屏蔽开始菜单, 因为系统检测到 Win 已经与另一个键组合使用. 但是, 鼠标热键和 Win 本身(~LWin::~RWin::) 不会屏蔽开始菜单.

开始菜单(或活动窗口的菜单栏) 可以通过发送任何按键来屏蔽. 以下示例禁用左 Win 激活开始菜单的功能, 同时仍允许将其用于修饰键:

~LWin::Send "{Blind}{vkE8}"

Send: Send, ControlSend 和相关的经常释放修饰键作为其正常操作的一部分. 例如, 热键 <#a::SendText Address 通常必须在发送 Address 的内容之前释放左 Win, 之后再按下左 Win 键(以便其他 Win 组合继续工作). 在这种情况下, 可以发送掩码键, 以防止 WinAlt 松开后激活菜单.

有关背景信息, 请参阅这个帖子.

示例

基础用法.

A_MenuMaskKey := "vkE8"  ; 将掩码键改成未分配的按键, 如 vkE8 等.
#Space::Run A_ScriptDir  ; 额外的 Ctrl 键不会被触发.

展示该变量如何使 vkFF 代替 LControl 被发送.

A_MenuMaskKey := "vkFF"  ; vkFF 是未映射的.
#UseHook
#Space::
!Space::
{
    KeyWait "LWin"
    KeyWait "RWin"
    KeyWait "Alt"
    KeyHistory
}