1

Тема: AHK: новый слой (раскладка) при зажатом модификаторе

Добрый день!

Подскажите, пожалуйста, можно ли (и как) сделать так, чтобы, например, при зажатом Space включался новый слой клавиш. То есть при нажатии "J" при зажатом пробеле печаталась "4", при двойном нажатии "J" при зажатом пробеле печаталось "44" и т.д.. При нажатии "JKL" печатолось "456" - все при единожды зажатом пробеле.

Либо, как вариант, слой менялся при первом нажатии и отпускании AltGr (RWin). А при втором клавиатура возвращалась в исходное состояние.

2

Re: AHK: новый слой (раскладка) при зажатом модификаторе

Пока вот два простых примера. С пробелом:

#If GetKeyState("Space", "P")
j::4
#If

Вариант с правым Alt, по-моему удобнее:

#If state = 1
j::4
#If

RAlt::
If state = 1
state := 0
Else state = 1
Return

3

Re: AHK: новый слой (раскладка) при зажатом модификаторе

ypppu
Спасибо огромное! все работает на ура

Есть маленький вопрос. В варианте с пробелом. Можно ли сделать, чтобы пробел работал как пробел только по отжатии и только в том случае, если в период его нажатого состояния не было нажато ничего другого.

Например,
0. Зажал пробел и держишь - ничего не печатается.
1. нажал и отжал пробел (задержка не важна, кроме пробела ничего не нажималось) - сработал пробел
2. Нажал пробел, нажал J, отжал пробел - напечаталась только 4

4 (изменено: stealzy, 2016-08-15 20:56:15)

Re: AHK: новый слой (раскладка) при зажатом модификаторе

Об использовании произвольных клавиш в качестве модификаторов
Вместо AppsKey ставите Space в первом примере.
Если захотите еще Ctrl+Space или Shift+Space вдобавок к Space+Ctrl и Space+Shift смотрите последний пример.

5

Re: AHK: новый слой (раскладка) при зажатом модификаторе

sd7962 пишет:

Можно ли сделать, чтобы пробел работал как пробел только по отжатии и только в том случае, если в период его нажатого состояния не было нажато ничего другого.

Такой вариант с костылём, простой для понимания.

#If GetKeyState("Space", "P")
j::
Send, 4
state := 1
Return
#If

Space:: state := 0 
 
#If state = 0
Space Up:: Send {Space}
#If    

6

Re: AHK: новый слой (раскладка) при зажатом модификаторе

Спасибо, все понятно!

stealzy пишет:

Вместо AppsKey ставите Space в первом примере.

В первом примере пробел как пробел не работает, вероятно из-за:

*AppsKey::Return

Вроде он блокируется этой командой...

Второй пример отлично подошел в качестве замены первого

Кстати, дополнительный слой оказалось можно подключить с помощью добавления буквы в комбинацию к пробелу, чему я безумно рад:

...
#If GetKeyState("Space", "P")
	j::4
	A & j:: Send, = 
#If
...

Таким образом можно достаточное количество слоев понаделать. Главное, чтобы глючить не начало...

7 (изменено: stealzy, 2018-07-25 21:41:29)

Re: AHK: новый слой (раскладка) при зажатом модификаторе

sd7962, заменить надо все вхождения AppsKey(их 5 в первом примере), думал это очевидно.
Ниже упущены скобки в условии If, из-за чего пробел не работает.

8

Re: AHK: новый слой (раскладка) при зажатом модификаторе

stealzy, я что-то упустил?

; * нужна, чтобы Space вызывалась / не вызывалась в сочетаниях с модификаторами,
; например Shift+Apps (расширенное контекстное меню в проводнике).
*Space::Return  ; Нажатие клавиши будет посылаться в момент ее отжатияия,
*Space Up::
	If A_PriorKey="Space"  ; если в период м/у ее зажатием и отпусканием не были нажаты какие-либо еще клавиши.
		Send {Blind}{Space}  ; Blind сохраняет зажатые клавиши зажатыми.
	; Например, без этой опции вместо при нажатии Shift+Apps будет послано просто Apps.
	Return

; Теперь можно создавать слой действий клавиш с нашим новым модификатором Space:
#If GetKeyState("Space", "P")
	j::1
	k::2
	l::3
#If
$Esc::ExitApp

Win 7 SP1
AHK 1.1.24.00