我正在研究一个脚本,该脚本仅将光标的移动限制在水平方向上。我想使用相同的热键来激活和停用它。
我正在使用以下代码:
#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脚本不会停止。
我使用了不正确的暂停和暂停命令吗?如何完成这项任务?
答案 0 :(得分:0)
这是一个整洁的功能!我绝对可以看到一些用处。无论如何,您正确地使用了Pause
和Suspend
,但是看来!s
是用来打开和关闭它的(因此,不需要!a
)。>
由于某种原因,它不会关闭。在我的测试中,该函数正确看到了“ Confine”的值,但没有返回三元运算的假部分。它似乎编码正确,但是我怀疑Return
正确评估“ Confine”是否存在问题(可能是错误?)。
以下是一些解决方案:
True
是可行的。Return ( Confine = True ) ? DllCall( "ClipCursor" , UInt , &R ) : DllCall( "ClipCursor" )
!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" )
。如果您决定走这条路,我建议从热键和功能中删除所有代码的切换部分。