Я не знаю, почему именно это не работает, я постараюсь выяснить после этого поста и отредактирую это, если узнаю. Однако в этом сценарии есть много вещей, неправильных (плохая практика), поэтому мы сможем легко получить рабочую версию.
В действительности, нет необходимости использовать несколько отправить команды. Просто поместите все символы в одну команду отправки.
Во-вторых, нет необходимости оборачивать эти клавиши вокруг {}
. Это делается только тогда, когда вы хотите экранировать специальные ключи. Например, перенос !
в {}
отправит буквенный ключ !
вместо клавиши ALT. (В AHK !
обозначает клавишу-модификатор ALT)
Хорошо, теперь ваш скрипт выглядит следующим образом
F7::
Loop
Send, 1----2----
return
F8::Pause
Я также убрал скобки вокруг l oop, они ' не нужны для одной строки. И добавил return
в конце горячей клавиши, хотя технически здесь не нужен, но он вроде как там. С return
вы останавливаете выполнение кода, и таким образом вы завершаете оператор горячих клавиш не для одной строки (не нужен для одной строки).
Но в вашем случае выполнение кода никогда не ускользнет l oop, так что это на самом деле не имеет значения.
Но что l oop все еще не прерывается вашей горячей клавишей паузы. Если бы вы использовали SendInput
, это бы сработало. Так что просто замените Send
на SendInput
.
Это также очень-очень быстро отправит ключи и будет более надежным. Даже если она слишком быстрая, вы можете переключиться обратно на Send
и настроить скорость с помощью SetKeyDelay
.
Даже лучше, чем использовать любой способ отправки этих клавиш, будет установка текст в буфер обмена и отправка ctrl + v. Теперь это быстро и надежно. Но, может быть, это немного излишне, поскольку ваша строка для отправки не такая длинная. Но если он станет длиннее, вы наверняка захотите это сделать.
Конечно, будет ли это работать, зависит от того, на что вы отправляете ввод. Вот минимальный пример для этого:
Clipboard := "This is a long string that's going to be sent instantly by the use of pasting it in.`nThis is a long string that's going to be sent instantly by the use of pasting it in."
F7::SendInput, ^v
Но все же , все это плохая практика, потому что мы используем al oop. И особенно l oop, который находится под горячей клавишей.
Теперь давайте перейдем к некоторым лучшим способам сделать это. Но сначала позвольте мне сказать, что на практике ничего из этого не имеет никакого значения, если весь ваш сценарий состоит только из этих двух горячих клавиш и ничего более. Но, тем не менее, для дальнейшего использования, когда вы сможете создавать более крупные и качественные сценарии, я хотел бы показать несколько лучших способов сделать это.
Во-первых, делая паузу, вы просто приостанавливаете весь сценарий (как и все циклы и таймеры и т. Д. c). Но вы никогда не выходите из l oop. Всегда, когда вы делаете паузу, l oop все еще будет работать там. Может быть нежелательно.
Вы можете включить в l oop некоторое условие, при котором нарушите l oop. Быстрый и минимальный пример нарушения l oop при выполнении условия:
F7::
BreakLoop := false
Loop
{
if (BreakLoop) ;if true
break
ToolTip, % A_TickCount ;built in variable that holds the time, in ms, since our system was started
}
return
F8::BreakLoop := true
Но на самом деле даже использование al oop может быть плохой практикой. Если бы у нас был скрипт побольше, мы бы хотели, чтобы l oop был чем-то, что просто работает на заднем плане. Но все oop этого не сделают.
Итак, во-вторых, вместо oop используется таймер , например:
F7::SetTimer, OurTimersCallbackLabel, 0 ;0 as in execute timer every "0" ms (as fast as possible)
F8::SetTimer, OurTimersCallbackLabel, Off ;turn off
OurTimersCallbackLabel:
ToolTip, % A_TickCount
return
Сладко, но мы можем сделать еще лучше. Позволяет использовать одну и ту же горячую клавишу для включения / выключения, поэтому нам не нужны две разные горячие клавиши:
Toggle := true
F7::
if (Toggle)
{
SetTimer, OurTimersCallbackLabel, 0
Toggle := false
}
else
{
SetTimer, OurTimersCallbackLabel, Off
Toggle := true
}
return
OurTimersCallbackLabel:
ToolTip, % A_TickCount
return
Хорошо, но, хотите верьте, хотите нет, мы можем сделать еще лучше, хотя эта часть не имеет значения на практике. Но мы можем использовать однострочное выражение для горячей клавиши:
F7::SetTimer, OurTimersCallbackLabel, % (Toggle:=!Toggle) ? 0 : "Off"
OurTimersCallbackLabel:
ToolTip, % A_TickCount
return
Фу, хорошо, это, конечно, немного сбивает с толку. Позвольте мне напечатать объяснение того, что происходит и почему это работает.
% ( ) ? <value> : <value>
Так что же это?
С %
принудительно задайте текущий параметр команды, в которой мы ведем себя, в синтаксисе выражения. Таким образом, вместо того, чтобы интерпретировать то, что мы печатаем буквально (как одну строку), он понимает, что мы делаем круто.
И тогда ( ) ? <value> : <value>
является троичным оператором.
Если выражение внутри ( )
имеет значение true, мы используем значение, которое было до :
( 0 в нашем случае), а если оно оценивается как false, мы используем значение после :
( строка Выкл. в нашем случае).
Toggle:=!Toggle
Переменная Toggle
, как и любая переменная, начинается со значения по умолчанию nothing , которое оценивает в false
в этом примере, поэтому мы просто скажем, что Toggle
начинается со значения false
, чтобы сделать вещи немного более простыми .
с :=
мы присвойте выражение (проще говоря, значение (в данном случае)) Toggle
(если вы еще не знаете разницу между =
и :=
, это то, что вы должны изучить, но это другое дело)
!Toggle
означает противоположное значение Toggle
.
Таким образом, противоположное false
(значение по умолчанию, которое любая переменная содержит в начале): true
Итак, теперь Toggle
содержит значение true
.
И утверждение нашей троицы, (Toggle:=!Toggle)
проверяет, является ли выражение n в скобках ( )
оценивается как true.
Хорошо, это так, поэтому мы выбираем значение true в нашей троичной системе.
В следующий раз (когда мы снова нажмем F7), переменная Toggle
уже содержит значение true
.
Затем мы снова делаем то же самое. Мы присваиваем !Toggle
Toggle
. На этот раз противоположное значение равно false
, поэтому оператор if оценивается как ложное, поэтому вместо этого мы выбираем значение false в нашей троичной форме.
И затем, когда F7 снова нажимается, мы меняем значение Toggle
снова противоположна. Значение
Toggle
постоянно меняется между истиной, ложью, истиной, ложью, истиной, ... и вот как мы получаем очень хороший, короткий, тумблер .
Очень длинный пост, я надеюсь, что кто-то что-то узнает или, по крайней мере, найдет это интересным. Ну, по крайней мере, мне понравилось писать это.