重映射按键和鼠标按钮

简介

限制: 下面描述的 AutoHotkey 重映射功能通常不如直接通过 Windows 注册表进行映射那么直接有效. 对于每种方法的优点和缺点, 请参阅 注册表重映射.

重映射键盘和鼠标

内置重映射功能的语法为 OriginKey::DestinationKey。例如, 只包含下面这行内容的 脚本 会将 "a" 键重映射成 "b" 键:

a::b

上面的例子没有改变 "b" 键自身的功能. "b" 键会继续发送 "b" 的键击, 除非把它重映射成其他功能, 就像下面例子中演示的那样:

a::b
b::a

上述例子中使用小写字母, 在大多数情况下建议这么做, 因为它也会映射相应的大写字母 (即在 Capslock 打开或 Shift 键被按住时会发送大写形式). 与之相比, 在右边使用大写字母会强制发送大写形式. 例如, 下面的代码行在您输入 "a" 或 "A" 时都会产生大写字母 B (只要 Capslock 是关闭的):

a::B

 

鼠标重映射: 要映射鼠标, 请使用和映射键盘相同的方法. 例如:

MButton::Shift 把鼠标中键映射成 Shift 键.
XButton1::LButton 把第四个鼠标按钮映射成鼠标左键.
RAlt::RButton 把右 Alt 映射成鼠标右键.

 

其他有用的映射:

Capslock::Ctrl 把 Capslock 映射成 Control 键. 要保留打开和关闭 Capslock 的功能,还需添加重映射 +Capslock::Capslock(这样,当您按住 shift 键并按下 Capslock 后就可以切换 Capslock 的状态了)。
XButton2::^LButton 把第五个鼠标按钮 (XButton2) 映射成 Control-LeftClick.
RAlt::AppsKey 把右 Alt 键映射成 Apps 键 (这是打开上下文菜单的按键).
RCtrl::RWin 把右 Control 键映射成右 Windows 键.
Ctrl::Alt 把左右 Control 键映射成 Alt 键. 但是, 请参阅 alt-tab 的问题.
^x::^c 把 Control-X 映射成 Control-C. 它也会让 Control-Alt-X 产生 Control-Alt-C, 等等.
RWin::Return 让右 Windows 键简单地执行 return 来禁用它.

您可以尝试执行这里的每个例子: 把它们复制到新文本文件 (例如 "Remap.ahk"), 然后运行这个文件.

请参阅 按键列表 来了解按键和鼠标按钮名称的完整列表.

备注

使用 #IfWinActive/Exist 指令可以让重映射仅在指定的窗口中有效. 例如:

#IfWinActive ahk_class Notepad
a::b  ; 让 'a' 键到 'b' 键的映射仅在记事本中有效.
#IfWinActive  ; 这里让后续的重映射和热键对所有窗口生效.

重映射按键和鼠标按钮在下面的关系中是 "完整的":

尽管被重映射的按键可以触发普通热键, 但默认情况下它不能触发鼠标热键或 钩子热键 (请使用 ListHotkeys 来找出哪些热键使用了钩子). 例如,如果重映射 a::b 有效,那么按下 Ctrl-Alt-A 会触发 ^!b 热键,但仅在 ^!b 不是钩子热键的时候。如果 ^!b 是钩子热键,而且您希望使用 Ctrl-Alt-A 来执行和 Ctrl-Alt-B 相同的动作,那么您可以把 ^!a 定义为热键。例如:

a::b
^!a::
^!b::
ToolTip You pressed %A_ThisHotkey%.
return

在 v1.1.06 及更高版本中, 还可使用 #InputLevel 来覆盖此默认行为. 例如:

#InputLevel 1
a::b

#InputLevel 0
^!b::
ToolTip You pressed %A_ThisHotkey%.
return

如果在自动运行段 (脚本的顶部) 使用了 SendMode, 那么它会影响所有的重映射. 但是, 由于重映射使用 Send {Blind}SendPlay 模式 不完全支持 {Blind}, 所以一些映射在 SendPlay 模式中可能无法正常运行 (尤其是 Control, Shift, Alt 和 Win). 要变通解决此问题, 当您脚本中含有重映射时请避免在自动执行段中使用 SendPlay; 而仅在整个脚本的一些需要的地方使用 SendPlay 命令而不是 Send. 或者, 您可以把您的重映射转换为热键 (如下所述), 这样就明确调用 SendEvent 而不是 Send.

加载脚本时, 每个重映射会被转换为一对 热键. 例如,包含重映射 a::b 的脚本实际包含下面的两个热键:

*a::
SetKeyDelay -1   ; 如果目标键是鼠标按钮, 则使用 SetMouseDelay 代替.
Send {Blind}{b DownTemp}  ; DownTemp 和 Down 相似, 不过使用 DownTemp 时脚本中后面的其他 Send 命令则不会假定 "b" 仍然处于按下的状态.
return

*a up::
SetKeyDelay -1  ; 请参阅下面的注意事项来了解在这段代码中两处 SetKeyDelay 都没有指定按键时长的原因.
Send {Blind}{b Up}
return

但是, 上面的两个热键在下列环境中会发生变化:

  1. 当原始键为 LCtrl 而目标键为 Alt 键时,会把 Send {Blind}{LAlt DownTemp} 这行语句替换为 Send {Blind}{LCtrl Up}{LAlt DownTemp}。如果原始键为 RCtrl 也会如此,除非使用了 {RCtrl up}
  2. 当键盘按键被重映射为鼠标按钮时(例如 RCtrl::RButton),在上面的热键中会使用 SetMouseDelay 代替 SetKeyDelay。而且, 上面的首个热键会被替换为下面的热键, 这样避免了由于键盘的自动重复功能生成的重复的鼠标点击:
    *RCtrl::
    SetMouseDelay -1
    if not GetKeyState("RButton")  ; 即鼠标右键还没有按下.
        Send {Blind}{RButton DownTemp}
    return

请注意在上面的热键中省略了 SetKeyDelay 的第二个参数 (按键时长). 这是因为按键时长不适用于独立的按键按下或按键弹起事件,例如 {b down}{b up}。但是,它适用于 Shift/Ctrl/Alt/Win 按键状态的改变,这会影响像 a::Ba::^b 的重映射。因此,脚本中任何在自动执行段生效的按键时长会应用于所有这类重映射。

尽管一对按键不能直接重映射为单个按键(例如 a & c::b 是无效的),不过只需要在前面的示例中添加明确的弹起和按下热键即可实现这种行为:简单地把 *a:: 替换为 a & c::,且把 *a up:: 替换为 a & c up::

由于重映射会被简单翻译为上面描述的热键, 所以 Suspend 也会影响它们. 同样地, Hotkey 命令可以禁用或修改重映射. 例如,下面的两个命令会禁用重映射 a::b

Hotkey, *a, off
Hotkey, *a up, off

Alt-tab 的问题: 如果您把一个按键或鼠标按钮映射为 Alt 键, 那么这个键很可能无法正确实现 alt-tab 的功能. 一个可能的变通解决方法是添加热键 *Tab::Send {Blind}{Tab},但是需要注意这样很可能妨碍使用真正的 Alt 实现 alt-tab 的功能。因此, 这种方法只应当用于在您希望单独使用重映射的按键和/或 alt-tab 热键 实现 alt-tab 功能的时候.

除了 按键列表 页面中的按键和鼠标按钮, 原始键还可以是在 特殊按键 页面描述的虚拟键 (VKnn) 或扫描码 (SCnnn). 对于目标键同样如此, 不过它还可以在虚拟键后指定扫描码. 例如,在大多数键盘布局中 sc01e::vk42sc030 相当于 a::b

要禁用按键而不进行重映射, 请把它设置为只含有 return 的热键. 例如,F1::return 会禁用 F1 键。

内置的重映射功能不支持下列键:

通过键盘移动鼠标光标

如同在全功能 键盘到鼠标的映射脚本 中演示的那样, 可以使用键盘来移动鼠标光标. 由于这个脚本提供了鼠标平滑移动, 加速和其他功能, 所以如果您想使用键盘实现许多的鼠标操作, 推荐您使用这个脚本. 与之相比, 下面的例子只是简化的演示:

*#up::MouseMove, 0, -10, 0, R  ; Win+UpArrow 热键 => 上移光标
*#Down::MouseMove, 0, 10, 0, R  ; Win+DownArrow => 下移光标
*#Left::MouseMove, -10, 0, 0, R  ; Win+LeftArrow => 左移光标
*#Right::MouseMove, 10, 0, 0, R  ; Win+RightArrow => 右移光标

*<#RCtrl::  ; LeftWin + RightControl => Left-click (按住 Control/Shift 来进行 Control-Click 或 Shift-Click).
SendEvent {Blind}{LButton down}
KeyWait RCtrl  ; 防止键盘自动重复导致的重复鼠标点击.
SendEvent {Blind}{LButton up}
return

*<#AppsKey::  ; LeftWin + AppsKey => Right-click
SendEvent {Blind}{RButton down}
KeyWait AppsKey  ; 防止键盘自动重复导致重复的鼠标点击.
SendEvent {Blind}{RButton up}
return

使用注册表的 "扫描码映射" 功能进行重映射

优点:

缺点:

如何修改注册表: 使用注册表重映射按键至少有两种方法:

  1. 使用像 KeyTweak (免费软件) 这样的程序在可视界面中重映射按键. 它会自动修改注册表.
  2. 手动创建重映射按键的 .reg 文件 (纯文本) 并把它载入注册表. 演示的例子请参阅 www.autohotkey.com/forum/post-56216.html#56216

相关主题

按键和鼠标按钮列表
GetKeyState
重映射操纵杆