Autohotkey Shift键训练轮和Shift圆括号重新映射
我希望使用自动热键来修改我的shift键的功能。Steve Losh的博客中描述了该功能。具体而言,我希望我的shift键执行以下操作:Autohotkey Shift键训练轮和Shift圆括号重新映射,autohotkey,Autohotkey,我希望使用自动热键来修改我的shift键的功能。Steve Losh的博客中描述了该功能。具体而言,我希望我的shift键执行以下操作: 如果在300毫秒内按下并释放了LShift或RShift,且其间未按下其他键,则分别发送(或) 如果在300毫秒内将升档和升档“滚动”在一起(按下升档、按下升档、松开升档、松开升档等),发送()或)() 如果换档钥匙使用不当(L换档和S、R换档和K等),则不会发生任何情况 我在300ms要求和“滚动”功能方面遇到了一些问题。具体来说,我遇到的问题是,由于热
- 如果在300毫秒内按下并释放了LShift或RShift,且其间未按下其他键,则分别发送
或(
)
- 如果在300毫秒内将升档和升档“滚动”在一起(按下升档、按下升档、松开升档、松开升档等),发送
或()
))(
- 如果换档钥匙使用不当(L换档和S、R换档和K等),则不会发生任何情况
LShift & 0:: return
这就是我目前的处境:
LShift::
Send {LShift Down}
KeyWait, LShift
Send {LShift Up}
if (A_TimeSinceThisHotkey < 300){
if (A_PriorKey = "LShift")
{
Send {)}
}
}
return
LShift::
发送{LShift Down}
钥匙等待,换档
发送{LShift Up}
如果(自该热键起的A_时间<300){
如果(A_priworkey=“LShift”)
{
发送{}
}
}
返回
我觉得有必要弄明白这一点。给你
我基本上为每个Shift+字母键组合创建了一个热键,以便发送正确的键大小写,并设置Abort
值。然后,每当按下其中一个Shift键以确定是否发送相应的(或)命令时,就会引用Abort
值
“滚动”是通过为LShift+RShift(反之亦然)创建热键来完成的。然后,它查看先释放哪个键以确定()
或)(
)
如果这就是你想要的,那就接受吧
Loop 26
{
Hotkey, % "~LShift & " Chr(A_Index+96), LetterKey ; Hotkeys for A-Z
Hotkey, % "~RShift & " Chr(A_Index+96), LetterKey ; Hotkeys for A-Z
}
Return
RShift::
LShift::
Abort := 0
keyDown := A_TickCount
Keywait, % A_ThisHotkey
duration := A_TickCount - keyDown
If (duration < 200) and (Abort = 0)
SendInput % (A_ThisHotkey = "LShift") ? "(" : ")"
Send {LShift Up}
Return
RShift & LShift::
LShift & RShift::
Keywait, LShift
If GetKeyState("RShift", "P")
{
Keywait, RShift
Send ()
}
Else
Send )(
Return
LetterKey:
SendInput, % "+" SubStr(A_ThisHotKey, 0, 1)
Abort := 1
Return
循环26
{
热键,%“~LShift&”Chr(A_索引+96),字母键;A-Z的热键
热键,%“~RShift&”Chr(A_索引+96),字母键;A-Z的热键
}
返回
换档::
LShift::
中止:=0
keyDown:=A_TickCount
按键等待,%A\u此热键
持续时间:=A_TickCount-向下键
如果(持续时间<200)和(中止=0)
SendInput%(A_ThisHotkey=“LShift”)?“(:”)
发送{LShift Up}
返回
升档和降档::
升档和升档:
钥匙等待,换档
如果GetKeyState(“RSShift”、“P”)
{
钥匙等待,重新换档
发送()
}
其他的
发送)(
返回
字母键:
SendInput,%%“+”子字符串(A_this热键,0,1)
中止:=1
返回
编辑:
嗯,我似乎和你有同样的问题。由于热键的原因,我的持续时间总是为0。我看不出有任何理由使用300毫秒超时,因为它似乎不可靠且不必要。
看看这段注释代码,它简短高效,似乎满足了您的所有要求:
LShift::Send, (
RShift::Send, )
LShift & RShift:: Send, ()
RShift & LShift:: Send, )(
/* Put your unwanted combinations here
* and let them do nothing
*/
LShift & q::return
RShift & y::return
编辑:由于LShift和RShift已经是前缀热键,我省略了所描述的技巧。MCL的答案很接近,但当我测试它时,我发现shift clicking并没有选择文本。下面是一个带有passthrough的版本,允许shift clicking工作
;shift to parens
LShift::Send, (
RShift::Send, )
LShift & RShift:: Send, ()
RShift & LShift:: Send, )(
;passthrough for shift-click
LShift & LButton::
Send, {LShift Down}{LButton}
Send, {LShift Up}
RShift & LButton::
Send, {RShift Down}{LButton}
Send, {RShift Up}
如果不深入了解autohotkey的实现或对autohotkey进行实际修改,我认为300毫秒超时是不可能的我发现A_\u prior热键的填充方式不一致。我不认为该变量应该以这种方式与修改键一起工作。我在自动热键论坛上找到并修改了该变量。(当您打算键入“K”时,原始脚本倾向于键入“K”)如果你打字太快,那么我已经修改了它,这样就不会再发生这种情况了)
是的,你可能会认为会有某种变通办法,但我还没有弄明白。不过谢谢你的努力!300毫秒超时的原因是当我开始键入内容,但在按下shift键后改变主意时。我不希望击键被误解为括号有意。我的
Caps-Lock
键以这种方式工作得非常可靠。轻触时,它发送Esc
,保持时,它发送Ctrl
@MikeMyers。我不太明白这一点。如果你键入错误,在99.9%的情况下,你将不得不处理它。如果你不小心键入了“a”,没有回去的路了,是吗?那么为什么要在这种情况下破例呢?你是对的;在不小心键入a
时,你仍然保留a
。然而,这与Shift
键不太相似,因为在进行此修改之前,如果我不小心按了Shift
键,那么返回的方式就是rel如我在问题中所述,超时将允许扩展Shift
键,同时也允许在出现打字错误时熟悉旧的Shift
键。
$LShift Up::send, % getkeystate("LShift") ? "{LShift Up}" : ""
$RShift Up::send, % getkeystate("RShift") ? "{RShift Up}" : ""
~$LShift::
KeyWait, LShift, T0.1 ; wait 100ms to check shift state
if (A_PriorKey = "LShift")
{
send, % getkeystate("LShift") ? "{LShift Down}" : "("
}
KeyWait, LShift
return
~$RShift::
KeyWait, RShift, T0.1 ; wait 100ms to check shift state
if (A_PriorKey = "RShift")
{
send, % getkeystate("RShift") ? "{RShift Down}" : ")"
}
KeyWait, RShift
return