1 (изменено: BlackCat, 2021-01-21 00:34:56)

Тема: AHK: Действия по многократному нажатию или удержанию одной клавиши

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

#NumpadAdd::
	; Действие по удержанию клавиши
	Keywait NumpadAdd, T0.2
	If (ErrorLevel) {
		WinMove A,,,, ScreenWidth/1.6, ScreenHeight/1.05
		Return
		}

Но при совмещении двух кусков кода второй иногда работает не так, как должно:

WinGetPos,,,, TaskBarHeight, ahk_class Shell_TrayWnd
ScreenHeight := A_ScreenHeight-TaskBarHeight+7
ScreenWidth := A_ScreenWidth

#NumpadAdd::
	; Действие по удержанию клавиши
	Keywait NumpadAdd, T0.2
	If (ErrorLevel) {
		WinMove A,,,, ScreenWidth/1.6, ScreenHeight/1.05
		Return
		}
		
	; Многократное нажатие
	Counter++
	If (Counter = 1) {
		SetTimer Action, 777
		}
Return

Action:
	If (Counter = 1) {
		WinMove A,,,, ScreenWidth/1.1, ScreenHeight/1.1
		}
	Else If (Counter = 2) {
		WinMove A,,,, ScreenWidth/1.2, ScreenHeight/1.2
		}
	Else If (Counter = 3) {
		WinMove A,,,, ScreenWidth/1.4, ScreenHeight/1.4
		}
	Counter := 0
Return

Что я делаю не так?

2

Re: AHK: Действия по многократному нажатию или удержанию одной клавиши

BlackCat пишет:

... второй иногда работает не так, как должно

А как должно?

Как минимум, происходит безусловное увеличение "Counter" на единицу, независимо от того, удерживается клавиша "NumpadAdd", или нажимается многократно, что заставляет выполниться первый "If" в "Action", а за тем, так же, безусловно происходит обнуление "Counter", в следствии чего, ей никогда не стать больше единицы.

Последняя фигурная скобка должна закрываться на том же уровне индентации, где начинается объявление инструкций, тело которых она содержит. У Вас она на один таб дальше, что сбивает с толку, так как она кажется вложенной из-за этого.

3 (изменено: BlackCat, 2021-01-21 01:06:42)

Re: AHK: Действия по многократному нажатию или удержанию одной клавиши

KusochekDobra пишет:

происходит безусловное увеличение "Counter" на единицу

Возможно именно это.
Как Вы поняли, данный скрипт изменяет размеры активного окна и после удержания клавиши иногда происходит незапланированное выполнение блока

If (Counter = 1)

4

Re: AHK: Действия по многократному нажатию или удержанию одной клавиши

KusochekDobra пишет:

происходит безусловное увеличение "Counter" на единицу, независимо от того, удерживается клавиша "NumpadAdd", или нажимается многократно

Вообще-то нет, там Return в случае, когда выполняется действие по удержанию.

BlackCat пишет:

Что я делаю не так?

Во-первых, таймер запускаете, только если Counter = 1, во-вторых, у вас таймер после запуска метки продолжает выполняться, то-есть метка будет выполняться бесконечно. Проверить можно так:

#NumpadAdd::
   ; Действие по удержанию клавиши
   Keywait NumpadAdd, T0.2
   If (ErrorLevel) {
      SoundBeep 900
      Return
      }
      
   ; Многократное нажатие
   Counter++
   If (Counter = 1) {
      SetTimer Action, 777
      }
Return

Action:
   If (Counter = 1) {
      SoundBeep 400
      }
   Else If (Counter = 2) {
      SoundBeep 600
      }
   Else If (Counter = 3) {
      SoundBeep 800
      }
   Counter := 0
   SoundBeep 400
Return 
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Действия по многократному нажатию или удержанию одной клавиши

Прошу прощения. Не заметил "Return" в первом условии.

6 (изменено: BlackCat, 2021-01-21 11:00:13)

Re: AHK: Действия по многократному нажатию или удержанию одной клавиши

teadrinker
Что-то я не совсем понял.
Точнее - понял, что ничего не понял.
Счетчик работает в части многократного нажатия.
Сбой происходит в части удерживания кнопки - несмотря на Return иногда происходит выполнение части кода

	If (Counter = 1) {
		WinMove A,,,, ScreenWidth/1.1, ScreenHeight/1.1
		}

Т.е., функция удерживания работает нормально, но иногда после отпускания клавиши выполняется этот кусок кода, который относится к многократному нажатию.

Можно по-подробнее, пожалуйста.
Может вообще невозможно посадить на одну кнопку функции многократного нажатия и удерживания?

7

Re: AHK: Действия по многократному нажатию или удержанию одной клавиши

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

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8 (изменено: BlackCat, 2021-01-21 11:30:35)

Re: AHK: Действия по многократному нажатию или удержанию одной клавиши

teadrinker
Ага, одну ошибку нашел.
Теперь сделал так (самый конец скрипта):

	Else If (Counter = 3) {
		WinMove A,,,, ScreenWidth/1.4, ScreenHeight/1.4
		}
	SetTimer Action, Off
	Counter := 0
Return

Все верно?

9

Re: AHK: Действия по многократному нажатию или удержанию одной клавиши

Уже лучше. Таймер с самого начала можно запускать только на один раз, почитайте справку.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Действия по многократному нажатию или удержанию одной клавиши

teadrinker
Сделал теперь так:

#NumpadAdd::
	; Многократное нажатие
	Counter++
	SetTimer Action, 777
	Return
	
Action:
	If (Counter = 1) {
		WinMove A,,,, ScreenWidth/1.1, ScreenHeight/1.1
		}
	Else If (Counter = 2) {
		WinMove A,,,, ScreenWidth/1.2, ScreenHeight/1.2
		}
	Else If (Counter = 3) {
		WinMove A,,,, ScreenWidth/1.4, ScreenHeight/1.4
		}
	SetTimer Action, Off
	Counter := 0
Return

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

11

Re: AHK: Действия по многократному нажатию или удержанию одной клавиши

Похожая тема AHK: Многодельность клавиши.

12 (изменено: BlackCat, 2021-01-21 18:50:52)

Re: AHK: Действия по многократному нажатию или удержанию одной клавиши

ypppu
Мне просто хотелось бы разобраться и понять, почему в моем варианте после выполнения этой части

#NumpadAdd::
	; Удержание клавиши
	Keywait NumpadAdd, T0.5
	If (ErrorLevel) {
		WinMove A,,,, ScreenWidth/1.8, ScreenHeight/1.08
		Return
		}

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

	If (Counter = 1) {
		WinMove A,,,, ScreenWidth/1.1, ScreenHeight/1.1
		}

13

Re: AHK: Действия по многократному нажатию или удержанию одной клавиши

BlackCat

Я бы так сделал. Правда с клавишей Альт.

WinGetPos,,,, TaskBarHeight, ahk_class Shell_TrayWnd
ScreenHeight := A_ScreenHeight-TaskBarHeight+7
ScreenWidth := A_ScreenWidth


; Многократное нажатие:
#If (Win = 1)
~Alt & NumpadAdd Up:: Counter++
#If

!NumpadAdd::
Counter := 0, Win := 1
KeyWait, Alt, U
Win =

Action:
If (Counter = 1)
 WinMove A,,,, ScreenWidth/1.1, ScreenHeight/1.1

Else If (Counter = 2)
 WinMove A,,,, ScreenWidth/1.2, ScreenHeight/1.2

Else If (Counter = 3)
 WinMove A,,,, ScreenWidth/1.4, ScreenHeight/1.4
Return
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

14

Re: AHK: Действия по многократному нажатию или удержанию одной клавиши

BlackCat пишет:

Мне просто хотелось бы разобраться и понять

Но вы же не хотите делать, что вам советуют.

teadrinker пишет:

Пока оставьте в покое WinMove, добейтесь нормальной работы примера, который я привел.

teadrinker пишет:

Таймер с самого начала можно запускать только на один раз, почитайте справку.

Зачем тогда спрашиваете?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder