Это не совсем просто, но это можно сделать с усилием.
В вашем примере для первых двух частей, куда вы отправляете ^ c в обоих случаях, я реализовал нечто очень близкое к этому для копирования скрытого текста в Word. Для этого случая использования не имеет значения, выполняется ли ^ c при каждом нажатии клавиши, а затем для "части 2", если второй ^ c соответствует тому, что вы можете назвать "временем двойного щелчка" - что является плохой номенклатурой так как никто ничего не нажимает - тогда и скрытый текст будет скопирован. Я назову это "время двойного нажатия" вместо времени двойного нажатия, и в любом случае хорошее начальное значение составляет около 500 мс.
Пример 1
Так что в моем коде, если я нажимаю ^ c один раз, он копирует. Если я нажимаю ^ ca второй раз, в течение 500 мс, он копирует скрытый текст (т.е. двойное нажатие). Если я нажимаю ^ ca во второй раз, но это было> 500 мс с момента последнего нажатия, то он просто копирует снова (без вреда, без фола).
Для этого вы создаете функцию, которая вызывается для горячей клавиши ^ c (которая является клавишей блокировки клавиш, т. Е. У нее нет тильды). Внутри функции статическая переменная используется для отслеживания времени последнего выполнения, а затем сравнивается с текущим временем выполнения. На основании результатов сравнения он либо отправляет ^ c, либо вызывает любой другой код, который вы хотите выполнить (или выполняет оба). Так что это будет работать для первых 2 частей вашего кода выше.
Оптимальное время для копирования / вставки
Кстати, вы также можете очистить буфер обмена перед копированием, а затем использовать ClipWait
, чтобы минимизировать динамическое время ожидания, которое потребуется для того, чтобы скопированный контент появился в буфере обмена. Это лучшее из обоих миров для минимальной задержки и максимальной надежности.
Пример 2
Другая выполнимая реализация, которая немного отличается, состоит в том, чтобы использовать модификатор + нажатие клавиши (с блокирующим определением горячей клавиши) для вызова функции, которая подсчитывает, сколько раз нажатие клавиши было нажато, прежде чем вы отпустите модификатор. В примере 1 ^ c выполняется, как только вы нажимаете ^ c. В следующем примере ^ c не будет отправлен, пока вы не отпустите ^ c.
Так для примера 2 ...
- Если ваша последовательность нажатий клавиш была
{Ctrl Down}{c down}{c up}{Ctrl Up}
, вариант 1 будет выполнен
- Если ваша последовательность нажатий клавиш была
{Ctrl Down}{c down}{c up}{c down}{c up}{Ctrl Up}
, вариант 2 будет выполнен
- ...
- Если ваша последовательность нажатий клавиш была
{Ctrl Down}{c down}{c up}{c down}{c up}{c down}{c up}{c down}{c up}{c down}{c up}{Ctrl Up}
, вариант 5 будет выполнен
В некоторых случаях, когда я использую это для 5 или более опций, я обычно показываю всплывающую подсказку или графический интерфейс, с помощью которого выбирается опция. Начальная горячая клавиша вызывает всплывающую подсказку / графический интерфейс пользователя и выбирает опцию 1. Удерживая нажатой клавишу Ctrl (в этом примере), экран GUI отображается, и опция не выбрана. т. е. вы должны полностью отключить модификатор горячей клавиши (управление), чтобы последовательность завершилась (немного отличается от приведенного выше примера). Пока у вас выключен модификатор, вы можете продолжать нажимать клавишу, и это будет увеличивать, какая опция выбрана, затем вы отпускаете клавишу модификатора, чтобы завершить выбор. Для многопользовательских меню, подобных этому, в которых используется графический интерфейс, у меня также есть циклический выбор опций, поэтому, если есть только 5 опций или что-то еще, то, если вы доберетесь до 6, он просто возвращается к 1 и позволяет вам переключать опции до получить тот, который вы хотите.
Это лучше для определенных вещей, когда вы хотите иметь несколько опций, нажимая клавиши, и вам не нужно, чтобы они были такими же быстрыми, поскольку они будут ждать, пока вы не отпустите клавиши для выполнения вместо (Пример 1), переходя на это, как только вы нажмете их.
Так что один из способов сделать это заключается в следующем:
Сначала вы создаете функцию, которая вызывается вашей горячей клавишей (пример ^ c). Эта функция отслеживает, сколько нажатий клавиш нажимается путем увеличения статической и / или глобальной переменной (зависит от настроек вашего кода).
myOption := ((myOption="") || (myOption=0) || (myOption=6)) ? 1 : myOption+1 ; set comparison value to max number of options and this code will cycle through them
Тернарный оператор здесь просто проверяет, инициализируем ли мы (переменная null или 0), и установит ли он значение 1, или мы достигли максимального количества опций + 1, т. Е. 5 + 1 = 6, например, в этом случае для 5 выбираемые параметры, затем также сбросьте до 1. В противном случае (значение после двоеточия) просто увеличьте выбранный параметр на 1.
Первая функция также вызывает вторую функцию «обработчик» асинхронно через SetTimer
(одноразовый вызов, поэтому SetTimer будет использоваться с некоторым отрицательным минимальным значением, скажем, -100). Это позволяет первой функции завершиться, чтобы основной поток мог продолжить выполнение, в то время как вторая функция также продолжает выполняться. т.е. вторая функция может выполняться, пока первая функция вызывается снова и снова для каждого последовательного нажатия клавиши, которое соответствует определению горячей клавиши. Если вы помещаете все в одну функцию, выполнение не завершается с первого раза, и вы не можете обнаружить последовательные нажатия клавиш с помощью определения горячей клавиши. (Вы все еще можете обнаружить их вручную, но более просто просто использовать существующую структуру горячих клавиш для обнаружения)
Вторая функция обработчика состоит из двух частей. Первая часть - это просто цикл, который проверяет, не выключен ли ваш модификатор. т.е.
While GetKeyState("Control", "P") ; wait for user to release modifier before continuing
Sleep 10
Как только функция-обработчик очищает цикл while, т. Е. Когда вы отпускаете клавишу-модификатор, все, что остается выполнить, - это любой код функции, который вам нужен, в зависимости от того, какая опция выбрана.
Это выбирается с помощью переменной, которая увеличивается первой функцией при каждом нажатии горячей клавиши, т.е.
If (myOption=1)
function1()
Else If (myOption=2)
function2()
...
Else If (myOption=5)
function5()
Чтобы это работало, вам также необходимо убедиться, что ваша область переменной myOption
подходит для функций (общих или глобальных).
Escape Handler
И последнее, что я также сделаю для этой настройки с несколькими опциями, - это реализация опции escape на случай, если я решу не выполнять ни одну из опций. Для этого у меня обычно есть третья функция в качестве обработчика escape, которая включена как условная горячая клавиша в первой функции.
Так, например, установите горячую клавишу ^ Escape с кодом, который вызовет экранирование, если нажата модификатор +escape. Это можно сделать, установив myOption = 0 и отправив {modifier up}
, чтобы принудительно завершить цикл обработчика, а затем завершить его без каких-либо действий. Это заставляет обработчик завершать работу без каких-либо других действий, кроме отключения условной горячей клавиши для обработчика Escape.
Нить, NoTimers, Ложь
И последнее замечание: вам может понадобиться использовать Thread, NoTimers, False
в первой вызывающей функции, которая влияет на последующие запущенные потоки, но необходима для немедленного прерывания первых строк кода длиной 15 мс /1000 другим вызовом горячей клавиши. Если у вас этого нет, нажатия клавиш могут быть "сброшены", или ваш пробег может варьироваться в зависимости от работы.
Вообще говоря, для всех наворотов, которые есть у AutoHotkey, я не нашел более упрощенного способа заставить работать макросы с несколькими нажатиями клавиш, но как только вы получите что-то подобное, реализованное в среде, которую вы можете настроить, чтобы отбрасывать различные. В случае исполнения, он будет работать очень надежно.