Уловка, чтобы поймать любое событие keyup/down, состоит в следующем:
*d::msgbox, d down
*d up::msgbox, d up
Обратите внимание, что "d down" срабатывает много раз, пока вы не отпустите его. *
обозначает любые клавиши-модификаторы, такие как shift/alt/ctrl/win (или ничего).
Чтобы справиться со всем, я использую sg. как это:
updateState(key, dir) {..}
*a::updateState("a", "down")
*a up::updateState("a", "up")
*b::updateState("b", "down")
*b up::updateState("b", "up")
*c::updateState("c", "down")
...
и я храню все необходимые мне состояния ключей в переменных, таких как key_a
, key_b
, key_capslock
, ..
Кроме того, текущее событие находится в такой переменной, как a_down
, a_up
, b_down
, b_up
, ..
Тогда я могу использовать операторы if-else, такие как
if(key_capslock and key_d and key_f and j_down) {
; do whatever
}
Нет, я не могу распознать снижение скорости при наборе текста.
Если CapsLock не нажата, я использую следующее, чтобы "пройти" нормальную функциональность клавиатуры:
; DEFAULT keyboard
if(key_capslock = 0) {
if(key_shift)
shift := "+"
if(key_ctrl)
ctrl := "^"
if(key_alt)
alt := "!"
if(dir="down") {
event = {%key% down}
}
else {
event = {%key% up}
}
SendInput, %shift%%ctrl%%alt%%event%
}
Изменить: Обратите внимание, что некоторые ключи не могут быть обнаружены одновременно, как (большинство?) Клавиатуры имеют матричную раскладку с горизонтальными и вертикальными проводами. После нажатия клавиши используется 1 горизонтальный и 1 вертикальный провод, поэтому следующее нажатие / отпускание клавиши, разделяющее любой из этих проводов, не может быть точно обнаружено. По этой причине я не могу использовать S и JKL одновременно, поэтому я использую F для FAAST вместо S для SPEEDY. : /