#autohotkey
#автоотключение
Вопрос:
Итак, я получил этот код, который работает почти нормально.. Возможно, это хорошая отправная точка, если вы сможете мне помочь.:
*LButton::
Send A
KeyWait, LButton, T1
If ErrorLevel
Send C
Else
Send B
KeyWait, LButton
Return
Что делает код, он определяет, каким будет действие выпуска, после того, как я отпущу LMB (левую кнопку мыши) и когда.
Если я выпущу LMB менее чем за 1 секунду, он отправит B. Если я отпущу его через 1 секунду, он должен отправить C, что он и делает, но не после того, как я отпущу LMB. Он отправляет C сразу после истечения 1 секунды. Я хочу отправить C только после того, как я выпущу LMB.
И если LMB был выпущен через 1 секунду, я хочу заблокировать LMB на x время. Так что я не смог повторить это снова.
Но если он был выпущен до 1 секунды, он должен работать нормально.
Английский никогда не был моей светлой стороной .. : D, надеюсь, вы сможете понять thx.
Комментарии:
1. Не могли бы вы лучше объяснить, что вы подразумеваете под этим «И если LMB был выпущен через 1 секунду, чем я хочу заблокировать LMB на x время. Так что я не смог снова нажать » ?
2. Когда вы говорите «Но если он был выпущен до 1 секунды, он должен работать нормально.» , Вы имеете в виду, что вы хотите, чтобы он щелкал, как обычно, мышью, или вы хотите
Send A B
, а не запускать блокировку?
Ответ №1:
Предполагая:
- Когда вы сказали «И если LMB был выпущен через 1 секунду, я хочу заблокировать LMB на x время. Так что я не смог нажать его снова», вы имели в виду, что хотели, чтобы нажатие на LMB не выполняло никаких действий в течение срока действия блока.
- Вы хотели, чтобы блок был активирован, только если было запущено второе действие (то, которое отправляет «C» по истечении определенного времени). Это позволит вам несколько раз щелкнуть мышью, чтобы отправить B, но вам придется подождать секунду, прежде чем вы сможете отправить что-либо после C.
Тогда решение, которое я придумал, включает в себя переключаемую переменную, которая определяет, будет ли горячая клавиша что-либо делать, если нажата LMB. Переменная переключения, switch
, устанавливается в режим отключения после активации части скрипта, но через одну секунду (1000 миллисекунд) переменная возвращается в состояние «включено». [Для справки, когда переключатель равен 1, горячая клавиша включена, но если она равна 0, она отключена.]
Код:
switch := 0
*LButton::
if(!switch){
Send A
KeyWait, LButton, T1
If ErrorLevel{
Send C
gosub, tempBlock
}
Else
Send B
KeyWait, LButton
Return
}
else
return
tempBlock:
switch:=1
SetTimer, reset, -1000
return
reset:
switch:=0
return
Комментарии:
1. C будет отправлен через 1 секунду, даже если LMB все еще удерживается нажатой. «else return» также является избыточным.
2. Да, srry об этом @0x464e. Это решение должно было быть быстрым и грязным скриптом, основанным на том, что было у OP. однако 2 вещи: 1. Я думал, что отправка C таким образом была желаемым результатом, поскольку именно это делал исходный код. 2. Да, этот возврат else определенно настолько избыточен, насколько это возможно. Это произошло до того, как я бросил туда msgbox во время отладки и не потрудился удалить оператор else после этого. В любом случае, помимо разницы в том, когда отправляется C (поскольку я не совсем знаю, какой из них нужен OP), ваш ответ, безусловно, является более чистым и лучше закодированным вариантом 🙂
3. мне нравятся оба ваших кода, я не знаю, действительно ли мне нужен блок LMB, но этот код делает это. может быть, если вы сможете реализовать опцию блокировки для кода @0x464e, было бы неплохо thx
4. хорошо, после небольшого тестирования этот код работает лучше для меня, я принимаю в качестве ответа спасибо всем вам
Ответ №2:
Очень легко сделать, если вы не пытаетесь возиться KeyWait
.
В приведенном ниже примере все еще отсутствует ваша «блокирующая» вещь. Я действительно не знаю, что вы имели в виду под этим.
Если это то, что вы не знаете, как добавить самостоятельно, я могу добавить это после того, как вы объясните это лучше.
*LButton::
ClickedAt := A_TickCount
SendInput, A
return
LButton Up::
if (A_TickCount - ClickedAt <= 1000)
SendInput, B
else
SendInput, C
return
То LButton::
же самое относится и к нажатой клавише. и LButton Up::
предназначен для освобождаемого ключа.
При нажатии кнопки вниз мы сохраняем текущее время безотказной работы системы из встроенной переменной A_TickCount
(docs), а при отпускании клавиши мы сравниваем текущее время безотказной работы системы с сохраненным, чтобы увидеть, сколько времени прошло.
SendInput также используется вместо традиционного Send
, поскольку SendInput
рекомендуется использовать более быстрый и надежный режим отправки.
Бонус, два вкладыша (потому что почему бы и нет):
*LButton::SendInput, % ("A", ClickedAt := A_TickCount)
LButton Up::SendInput, % (A_TickCount - ClickedAt <= 1000) ? "B" : "C"
Комментарии:
1. привет, спасибо за справочный код, работает очень хорошо, а 2 вкладыша просто сексуальны. : D что я подразумеваю под блокировкой, так это то, что я не могу снова щелкнуть LMB как минимум на полсекунды после отправки C. в противном случае он работает очень хорошо.