问题描述
我想用 LCtrl 交换 LAlt,这本身就很简单:
#SingleInstance Force
#UseHook
#MenuMaskKey VKFF
SetWorkingDir %A_ScriptDir%
SendMode Input
LAlt::RCtrl
RCtrl::LAlt
它只是有效。但我想这样做的主要原因是阻止 LAlt 作为菜单键的功能。我想要物理 LAlt 按钮与 J、K、L、I的组合> 用作箭头键并且 LAlt 没有被完全静音意味着我无法使用它们来导航上下文菜单 - 因为 Alt 在按下键时关闭它们。如果我将 <!i::Send {Up}
添加到脚本中,这正是会发生的情况。现在 LAlt 不会在按下键时被阻止 - 现在按下它会在菜单选项名称下方显示下划线,以前不是这种情况,并且任何打开的上下文菜单都将关闭。
所以我的主要问题是:为什么会发生这种情况?为什么(额外的)热键会破坏重新映射,有什么方法可以防止\解决\处理它?
现在,我知道如何解决此问题的一种方法是使用 >^i::Send {Up}
,并且由于热键在其他情况下不起作用,因此删除 SendMode Input
。但是文档说 sendinput
更好,因此我选择了另一种方式 - 将脚本一分为二,一个运行另一个。
; Script One: ; Script Two (two.ahk):
#SingleInstance Force #SingleInstance Force
#UseHook #UseHook
#MenuMaskKey VKFF #MenuMaskKey VKFF
SetWorkingDir %A_ScriptDir% SetWorkingDir %A_ScriptDir%
SendMode Input SendMode Input
Run two.ahk >^i::Send {RCtrl up}{Up}{RCtrl down}
>^k::Send {RCtrl up}{Down}{RCtrl down}
LAlt::RCtrl >^j::Send {RCtrl up}{Left}{RCtrl down}
RCtrl::LAlt >^l::Send {RCtrl up}{Right}{RCtrl down}
Capslock::Backspace >^o::Send +{F10}
这似乎工作正常,但有没有更好的方法可以实现我想要的?就像在一个文件中做一样,保持 SendMode Input
而不必用 {RCtrl up} ... {RCtrl down}
中和 RCtrl?
解决方法
来自文档:
虽然重新映射的键可以触发普通热键,但默认情况下不能触发鼠标热键或钩子热键
既然你有#UseHook
,我想如果你和#InputLevel
一起玩,你可以做你想做的https://www.autohotkey.com/docs/commands/_InputLevel.htm