如何使用按键打开/关闭AHK脚本?

时间:2019-06-03 11:10:18

标签: autohotkey

我正在研究一个脚本,该脚本仅将光标的移动限制在水平方向上。我想使用相同的热键来激活和停用它。

我正在使用以下代码:

#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.


!s:: ; Hotkey will toggle status
Confine := !Confine
MouseGetPos, , SetY
ClipCursor( Confine, 0, SetY, A_ScreenWidth, SetY+1 )
return

!a::
Pause
Suspend
return

ClipCursor( Confine=True, x1=0 , y1=0, x2=1, y2=1 ) {
 VarSetCapacity(R,16,0),  NumPut(x1,&R+0),NumPut(y1,&R+4),NumPut(x2,&R+8),NumPut(y2,&R+12)
Return Confine ? DllCall( "ClipCursor", UInt,&R ) : DllCall( "ClipCursor" )
}

该代码有效,但是按ctrl + a脚本不会停止。

我使用了不正确的暂停和暂停命令吗?如何完成这项任务?

1 个答案:

答案 0 :(得分:0)

这是一个整洁的功能!我绝对可以看到一些用处。无论如何,您正确地使用了PauseSuspend,但是看来!s是用来打开和关闭它的(因此,不需要!a)。

由于某种原因,它不会关闭。在我的测试中,该函数正确看到了“ Confine”的值,但没有返回三元运算的假部分。它似乎编码正确,但是我怀疑Return正确评估“ Confine”是否存在问题(可能是错误?)。

以下是一些解决方案:

  • 通过显式测试“ Confine”是否等于True是可行的。
Return ( Confine = True ) ? DllCall( "ClipCursor" , UInt , &R ) : DllCall( "ClipCursor" )
  • 但是,我要做的是将三元运算从函数中移出并将其移至您的热键,以避免在运算结果为false时进行不必要的操作和分配。对我来说,这有点干净。
!s:: ; Hotkey will toggle status
Confine := !Confine
MouseGetPos ,, SetY
Confine ? ClipCursor( 0 , SetY , A_ScreenWidth , SetY+1 ) : DllCall( "ClipCursor" )
Return

ClipCursor( x1=0 , y1=0 , x2=1 , y2=1 ) {
    VarSetCapacity( R , 16 , 0 )
    NumPut( x1 , &R + 0 )
    NumPut( y1 , &R +4 )
    NumPut( x2 , &R +8 )
    NumPut( y2 , &R +12 )
Return DllCall( "ClipCursor" , UInt , &R )
}
  • 如果您只想使用!a将其关闭,则可以执行此操作,!a::DllCall( "ClipCursor" )。如果您决定走这条路,我建议从热键和功能中删除所有代码的切换部分。