Как включить / выключить скрипт AHK клавишей? - PullRequest
0 голосов
/ 03 июня 2019

Я работаю над сценарием, который ограничивает движение курсора только в горизонтальном направлении.Я хотел бы активировать и деактивировать его с помощью той же горячей клавиши.

Я использую этот код:

#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 голосов
/ 03 июня 2019

Это аккуратная функция!Я определенно вижу некоторую пользу для этого.В любом случае, вы правильно используете Pause и Suspend, но похоже, что !s предназначался для его включения и выключения (поэтому нет необходимости в !a).

По некоторым причинам,тем не менее, он не выключится.В моем тестировании функция правильно видела значение «Confine», но не возвращала ложную часть троичной операции.Кажется, он правильно закодирован, но я подозреваю, что может быть проблема (возможная ошибка?) С Return, правильно оценивающим «Confine».

Вот несколько решений:

  • Путем явной проверки, работает ли «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" ).Если вы решите пойти по этому пути, я бы порекомендовал удалить все переключаемые части кода из горячей клавиши и функции.
...