限制: 下面描述的 AutoHotkey 重映射功能通常不如直接通过 Windows 注册表进行映射那么直接有效. 对于每种方法的优点和缺点, 请参阅注册表重映射.
内置重映射功能的语法为 OriginKey::DestinationKey
. 例如, 只包含下面这行内容的脚本会将 A 键重映射成 B 键:
a::b
上面的例子没有改变 B 键自身的功能. B 键会继续发送 "b" 的键击, 除非把它重映射成其他功能, 就像下面例子中演示的那样:
a::b b::a
上述例子中使用小写字母, 在大多数情况下建议这么做, 因为它也会映射相应的大写字母(即在 CapsLock 打开或 Shift 键被按住时会发送大写形式). 与之相比, 在右边使用大写字母会强制发送大写形式. 例如, 下面的代码行在您输入 "a" 或 "A" 时都会产生大写字母 B(只要 CapsLock 是关闭的):
a::B
然而, 与上面相反的映射将不会像人们所期望的那样工作, 因为一个重新映射从来不会“释放”用来触发它的修饰符键. 例如, A::b
通常相当于 A::B
和 ^a::b
相当于 ^a::^b
. 这是因为每个重映射在内部使用 {Blind} 来允许键或键组合与其他修饰符组合在一起.
要映射鼠标为键盘, 请使用和映射键盘相同的方法. 例如:
MButton::Shift |
把鼠标中键映射成 Shift 键. |
XButton1::LButton |
把第四个鼠标按钮映射成鼠标左键. |
RAlt::RButton |
把右 Alt 映射成鼠标右键. |
CapsLock::Ctrl |
把 CapsLock 映射成 Ctrl 键. 要保留打开及关闭 CapsLock 的功能, 需先包含重映射 +CapsLock::CapsLock . 这样, 当按住 Shift 并点击 Capslock 时, 可切换 CpasLock 的开关状态. 因为两个重映射均允许附加修饰键被按下, 额外指定的 +CapsLock::CapsLock 重映射须优先放置. |
XButton2::^LButton |
把第五个鼠标按钮(XButton2) 映射成 Control-LeftClick. |
RAlt::AppsKey |
把右 Alt 键映射成 Menu 键(这是打开上下文菜单的按键). |
RCtrl::RWin |
把右 Ctrl 键映射成右 Win 键. |
Ctrl::Alt |
把左右 Ctrl 键映射成 Alt 键. 但是, 请参阅 alt-tab 的问题. |
^x::^c |
把 Ctrl+X 映射成 Ctrl+C. 它也会让 Ctrl+Alt+X 产生 Ctrl+Alt+C, 等等. |
RWin::Return< | 禁用右 Win 键, 通过简单地执行 return. |
您可以尝试执行这里的每个例子: 把它们复制到新文本文件(例如 "Remap.ahk"), 然后运行这个文件.
请参阅按键列表来了解按键和鼠标按钮名称的完整列表.
使用 #IfWinActive/Exist 指令可以让重映射仅在指定的窗口中有效. 例如:
#IfWinActive ahk_class Notepad a::b ; 让 'a' 键到 'b' 键的映射仅在记事本中有效. #IfWinActive ; 这里让后续的重映射和热键对所有窗口生效.
重映射按键和鼠标按钮在下面的关系中是 "完整的":
b::a
会在您按下 Ctrl+B 时产生 Ctrl+A 的效果.尽管被重映射的按键可以触发普通热键, 但默认情况下它不能触发鼠标热键或钩子热键(请使用 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 模式中可能无法正常运行(尤其是 Ctrl, Shift, Alt 和 Win). 要变通解决此问题, 当您脚本中含有重映射时请避免在自动执行段中使用 SendPlay; 而仅在整个脚本的一些需要的地方使用 SendPlay 命令而不是 Send. 或者, 您可以把您的重映射转换为热键(如下所述), 这样就明确调用 SendEvent 而不是 Send.
加载脚本时, 每个重映射会被转换为一对热键. 例如, 包含重映射 a::b
的脚本实际包含下面的两个热键:
*a:: SetKeyDelay -1 ; 如果目标键是鼠标按钮, 则使用 SetMouseDelay 代替. Send {Blind}{b DownR} ; DownR 和 Down 相似, 不过使用 DownTemp 时脚本中后面的其他 Send 命令则不会假定 "b" 仍然处于按下的状态. return *a up:: SetKeyDelay -1 ; 请参阅下面的注意事项来了解在这段代码中两处 SetKeyDelay 都没有指定按键时长的原因. Send {Blind}{b up} return
但是, 上面的两个热键在下列环境中会发生变化:
Send {Blind}{LAlt DownR}
这行语句替换为 Send {Blind}{LCtrl up}{LAlt DownR}
. 如果原始键为右 Ctrl 键也会如此, 除非使用了 {RCtrl up}
.RCtrl::RButton
), 在上面的热键中会使用 SetMouseDelay 代替 SetKeyDelay. 而且, 上面的首个热键会被替换为下面的热键, 这样避免了由于键盘的自动重复功能生成的重复的鼠标点击:
*RCtrl:: SetMouseDelay -1 if not GetKeyState("RButton") ; 即鼠标右键还没有按下. Send {Blind}{RButton DownR} return
在 [v1.1.27] 之前, 使用 DownTemp 而不是 DownR.
请注意在上面的热键中省略了 SetKeyDelay 的第二个参数(按键时长). 这是因为按键时长不适用于独立的按键按下或按键弹起事件, 例如 {b down}
和 {b up}
. 但是, 它适用于 Shift/Ctrl/Alt/Win 按键状态的改变, 这会影响像 a::B
或 a::^b
的重映射. 因此, 脚本中任何在自动执行段生效的按键时长会应用于所有这类重映射.
由于重映射会被简单翻译为上面描述的热键, 所以 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 键.
内置的重映射功能不支持下列键:
x::+sc01A
和 y::+sc01B
.如同在全功能键盘到鼠标的映射脚本中演示的那样, 可以使用键盘来移动鼠标光标. 由于这个脚本提供了鼠标平滑移动, 加速和其他功能, 所以如果您想使用键盘实现许多的鼠标操作, 推荐您使用这个脚本. 与之相比, 下面的例子只是简化的演示:
*#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
优点:
缺点:
如何修改注册表: 使用注册表重映射按键至少有两种方法:
按键和鼠标按钮列表
GetKeyState(获取键状态)
重映射操纵杆