# #MenuMaskKey [AHK_L 38+]

改变用来掩饰(屏蔽) `Win` 或 `Alt` 松开事件的按键.

    #MenuMaskKey KeyName

## 参数

KeyName

  按键名称或指定了非零虚拟按键代码的 VKnn 序列. 扫描码只在 [v1.1.28+] 中可以使用, 它也支持 SCnnn 和 VKnnSCnnn.

## 备注

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

默认的掩饰键为 `Ctrl`. 此指令可用于将掩饰键更改为具有较少副作用的键.

好的候选者一般是没有效果的虚拟按键代码, 例如 vkE8, 微软的文档是 "未定义的", 或 vkFF, 它被保留为 "没有映射"(一个没有功能的按键).

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

[v1.1.28+]: 可以指定 VK 和 SC, 并且不需要匹配存在的按键. 指定 `vk00sc000` 将禁用所有自动掩饰. 某些值, 如 0 VK 带有非-0 SC, 可能无法抑制开始菜单.

此设置是全局的, 这意味着只需要使用一次(在脚本的任意位置) 就会影响整个脚本.

和其他指令一样, #MenuMaskKey 不能有条件地执行.

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

[v1.1.27+]: 如果满足以下所有条件, 则按下钩子热键将导致下一个 Alt 键或 Win 键被屏蔽(发送掩饰键):

- 热键原有功能被屏蔽(没有颚化符修饰键).
- 当热键按下时, `Alt` 或 `Win` 逻辑上是按下的.
- 修饰符物理上被按下或热键需要修饰符是激活的. 例如, `$#a::` 结合 `AppsKey::RWin` 在一起时, 当 `Menu`+`A`按下时发送掩饰键, 但是 `Menu` 本身能打开开始菜单.
- 如果按下了 `Ctrl`, 则不会掩饰(屏蔽) `Alt`, 因为 `Ctrl+Alt` 不激活菜单栏.
- 如果最近的 Win 按下被 `Ctrl`, `Shift` 或 `Alt` 修饰, 则不会掩饰(屏蔽) `Win`, 因为在这种情况下开始菜单通常不会激活. 但是, 如果按键是最后物理按下的键时, 即使是 Win 键重复按键也会发生, 因此很难预测 什么时间 是最近的 Win 键被按下的时间.
- 要么没有使用键盘钩子(如 鼠标热键), 要么自最近一次 Alt 或 Win 按下之后没有其他按下或松开事件发生. 请注意, 即使对于修饰键, 甚至在发送其他键之后, 重复按键也会发生, 但只发生在最后一次物理按下的键上.

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

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

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

    ~LWin::Send {Blind}{vkE8}

Send: Send, ControlSend 和相关命令经常松开修饰键作为其正常操作的一部分. 例如, 热键 `<#a::SendRaw %Address%` 通常必须在发送 Address 的内容之前释放 LWin 键, 然后再按下左 `Win`(以便其他 Win 键组合继续工作). 在这种情况下可能会发送掩码键以防止 Win 或 Alt 键松开启动了菜单.

## 相关

请参阅这个帖子了解背景信息.

## 示例

基础用法.

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

展示该指令如何使 vkFF 代替 LControl 被发送.

    #MenuMaskKey vkFF  ; vkFF 是未映射的.
    #UseHook
    #Space::
    !Space::
        KeyWait LWin
        KeyWait RWin
        KeyWait Alt
        KeyHistory
    return

dftg