1 (изменено: ForceQuell, 2019-02-22 17:25:32)

Тема: AHK: Зажать клавишу, если не нажаты остальные

Добрый день!

Нужен скрипт, который будет зажимать клавишу (ну например p), если все клавиши из определенного набора (например a, r, t) отпущены. То есть если хотя бы одна клавиша из приведенного набора нажата, то зажатие p прекращается.

(это нужно для самодельной коробки передач, в которой есть 6 положений самих передач, но нет положения нейтрали. И когда не "нажата" ни одна из передач, считаем, что включена нейтралка)

2

Re: AHK: Зажать клавишу, если не нажаты остальные

Вам нужны команда while и функция getkeystate. Читайте в справке, но для начала освежите в памяти правила форума.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

3

Re: AHK: Зажать клавишу, если не нажаты остальные

belyankin12

Изменил заголовок, извиняюсь.

Я пытался реализовать это вот так:


	F3::
Loop {
	if ( NOT((GetKeyState(a) AND GetKeyState(r)) AND GetKeyState(t)) ) {
		Send {p}
	}
	if (GetKeyState(F4)) {
		break
	}
}

Т.е. по нажатию F3 запускать бесконечный цикл, в котором каждую итерацию проверяются состояния нужных клавиш, а по F4  цикл останавливается. Но оно не работает как надо: p зажимается, но при нажатии и удержании одной из заданной клавиш в блокноте выводится что-то типа: "papapapapa". И по F4 скрипт не прерывается.

4 (изменено: belyankin12, 2019-02-22 18:55:32)

Re: AHK: Зажать клавишу, если не нажаты остальные

Во-первых рекомендуется использовать кодовое значение клавиши а не его имя, так мы сразу избавляемся от зависимости активной раскладки клавиатуры (коды можно посмотреть в гугле, либо в KeyHistory во время работы скрипта, однако нужно установить клавиатурный хук соотв. командой). Цикл лучше поместить в секцию автовыполнения (чтобы он выполнялся постоянно), а если необходима возможность отключать/включать цикл можно с помощью горячей клавиши менять значение какой-нибудь переменной на 1 для включения и 0 для выключения, которую будет цикл проверять в самом начале и пропускать итерацию командой continue пока не будет нажата клавиша активации цикла. Кроме того лучше отслеживать физическое состояние клавиши в данный момент параметром P. Чтобы зажать клавишу используйте слово down после имени клавиши (которое тоже лучше указать в виде кода). Вот как это все я смог реализовать:

L_Active := 1


Loop {
    if (!L_Active) {
        continue
    }
    
    if (!getKeyState("vk41", "P")) and (!getKeyState("vk52", "P")) and (!getKeyState("vk54", "P")) {
        SendInput {vk50 down}
    } else if (getKeyState("vk41", "P")) or (getKeyState("vk52", "P")) or (getKeyState("vk54", "P")) {
        SendInput {vk50 up}
    }
}

F3:: L_Active := L_Active = 1 ? 0 : 1

Протестировал в окне блокнота, пока зажата одна из трех клавиш клавиша P сразу отжимается. Иногда в момент зажатия клавиши нажатие клавиши P отправляется ещё один раз после чего прерывается, с чем это связано понять не могу, может товарищи поопытнее подскажут здесь.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

5 (изменено: stealzy, 2019-02-22 22:12:59)

Re: AHK: Зажать клавишу, если не нажаты остальные

А вы без цикла сделайте: поставьте хоткеи на нажатие клавиш набора и на их же отжатие. Разумеется ставьте прозрачно, чтобы не мешать самим нажатиям.

belyankin12 пишет:

Иногда в момент зажатия клавиши нажатие клавиши P отправляется ещё один раз

Команда Send по-умолчанию отжимает все клавиши перед началом работы, а после восстанавливает состояние.

6 (изменено: serzh82saratov, 2019-02-23 12:33:58)

Re: AHK: Зажать клавишу, если не нажаты остальные

#NoEnv

#If Work

~A::
~R::
~T:: Pause := 1

~A Up::
~R Up::
~T Up:: Pause := 0

F3:: Work := 0

#If !Work

F3::
	Work := 1
	While Work
	{
		If !Pause
			SendInput {P down}
		Sleep 30
	}
	SendInput {P up}
	Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK: Зажать клавишу, если не нажаты остальные

belyankin12 пишет:

Во-первых рекомендуется использовать кодовое значение клавиши а не его имя, так мы сразу избавляемся от зависимости активной раскладки клавиатуры

Для символов a-z это довольно давно не требуется https://www.autohotkey.com/docs/AHKL_Ch … v1.1.27.00.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8

Re: AHK: Зажать клавишу, если не нажаты остальные

serzh82saratov, похоже вы когда в нейтралку переводите, руку не снимаете с рычага, а начинаете бешено теребить его. Интересно, зачем вы это делаете?

9

Re: AHK: Зажать клавишу, если не нажаты остальные

?

SendInput {P down}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Зажать клавишу, если не нажаты остальные

Осталось избавиться от ненужного цикла и будет почти как я описал.

11

Re: AHK: Зажать клавишу, если не нажаты остальные

Так у ТС спам прописан.

Loop {
	if ( NOT((GetKeyState(a) AND GetKeyState(r)) AND GetKeyState(t)) ) {
		Send {p}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12

Re: AHK: Зажать клавишу, если не нажаты остальные

Если спам не нужен, то так:


F3::
	Work := 1 
	While Work
	{
		If Pause && GetKeyState("P")
			SendInput {P up}
		Else If !Pause && !GetKeyState("P")
			SendInput {P down}
		Sleep 30
	}
	SendInput {P up}
	Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: Зажать клавишу, если не нажаты остальные

Мне казалось это по совету belyankin12, изначально было так:

ForceQuell пишет:

Нужен скрипт, который будет зажимать клавишу

Ну пусть даже так, едем дальше.

Пользователь включает передачу, а вы, вместо того чтобы просто выключить нейтралку,
выключаете передачу, выключаете нейтралку и затем возвращаете передачу во включенное состояние. Техника дергается и ломается, иногда появляются глюки.

14

Re: AHK: Зажать клавишу, если не нажаты остальные

Зачем гадать что нужно ТС, пусть сам напишет, варианты предложены.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15 (изменено: serzh82saratov, 2019-02-23 13:05:05)

Re: AHK: Зажать клавишу, если не нажаты остальные

Хотя если спам не нужен, то проще так:


#NoEnv

#If Work

~A::
~R::
~T:: 
	SendInput {P up}
	Return

~A Up::
~R Up::
~T Up:: 
	SendInput {P down}
	Return

F3:: 
	Work := 0
	SendInput {P up}
	Return

#If !Work

F3::
	Work := 1
	SendInput {P down}
	Return
#If
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16 (изменено: serzh82saratov, 2019-02-23 13:29:20)

Re: AHK: Зажать клавишу, если не нажаты остальные

Хотя нет, зажимать можно только когда все отпущены.


#NoEnv

#If Work

~A::
~R::
~T:: 
	SendInput {Blind}{P up}
	Return

~A Up::
~R Up::
~T Up:: 
	Sleep 50
	If !GetKeyState("A") && !GetKeyState("R") && !GetKeyState("T")
		SendInput {Blind}{P down}
	Return

F3:: 
	Work := 0
	SendInput {Blind}{P up}
	Return

#If !Work

F3::
	Work := 1
	If !GetKeyState("A") && !GetKeyState("R") && !GetKeyState("T")
		SendInput {Blind}{P down}
	Return
	
#If
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17 (изменено: stealzy, 2019-02-23 13:12:33)

Re: AHK: Зажать клавишу, если не нажаты остальные

Так я и не гадаю, просто читаю первое сообщение темы.

serzh82saratov пишет:

пусть сам напишет

Как раз на это рассчитывал, но тут залетает serzh82saratov и кидает код Loop SendInput p, игнорируя все сообщения в теме.

stealzy пишет:

Пользователь включает передачу, а вы, вместо того чтобы просто выключить нейтралку,
выключаете передачу, выключаете нейтралку и затем возвращаете передачу во включенное состояние. Техника дергается и ломается, иногда появляются глюки.

По этому пункту исправлять значит уже не будете? Ну хоть без цикла теперь.

18

Re: AHK: Зажать клавишу, если не нажаты остальные

stealzy пишет:

По этому пункту исправлять значит уже не будете?

В 16 не то?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: Зажать клавишу, если не нажаты остальные

stealzy пишет:

Так я и не гадаю, просто читаю первое сообщение темы.

Зажатие может подразумевать спам, имитируя физическое зажатие.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

20 (изменено: stealzy, 2019-02-23 13:19:09)

Re: AHK: Зажать клавишу, если не нажаты остальные

Не, в 16 без учета. Я в первом своем сообщении написал почему. Насчет спама согласен.

21

Re: AHK: Зажать клавишу, если не нажаты остальные

Не понял, без учёта чего?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22

Re: AHK: Зажать клавишу, если не нажаты остальные

stealzy пишет:

Send по-умолчанию отжимает все клавиши перед началом работы

Я бы добавил {blind} везде, а то часто потом жалуются на дерганья.

23

Re: AHK: Зажать клавишу, если не нажаты остальные

Не помешает. Поправил 16.
Ещё добавил Sleep перед GetKeyState, иногда всё ещё считает нажатой.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24 (изменено: belyankin12, 2019-02-23 13:37:29)

Re: AHK: Зажать клавишу, если не нажаты остальные

stealzy, дык и в моем коде спама клавишей нет, при чем тут я ?

P.S. Не знал про возможность назначить хоткей на Key Down Key Up, тогда и вправду цикл тут не нужен.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

25

Re: AHK: Зажать клавишу, если не нажаты остальные

Про Key Down думаю знали.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

26

Re: AHK: Зажать клавишу, если не нажаты остальные

Может и знал но из-за того что не практиковал такой метод применения и не додумался. Но на самом деле и вправду не знал ибо не возникало необходимости в его применении.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

27

Re: AHK: Зажать клавишу, если не нажаты остальные

belyankin12 пишет:

назначить хоткей на Key Down

Про такой не знали?

F3::MsgBox
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

28

Re: AHK: Зажать клавишу, если не нажаты остальные

А, вы имели ввиду чисто про Key Down, я думал вы подразумевали и Key Up, тут вы правы.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.