1

Тема: AHK: Задание условия на нажатие клавиши

Извиняюсь за корявое описание, но буду признателен подсказке, как задать действие на двойное нажатие клавиши, если одиночное нажатие этой же клавиши уже используется в качестве горячей клавиши, а также задать условие на нажатие клавиши?
Что требуется:

При нажатии F2 отправить команду нажатия клавиши F2

F2:: Send, {F2}

Если в течении двух секунд после этого мною повторяется нажатие клавиши F2 , то отправить еще одно сочетание клавиш, а именно:

Send, {ctrl down}{shift down}{]}{shift up}{ctrl up}{e}

2

Re: AHK: Задание условия на нажатие клавиши

$F2:: Send % (A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<2000) ? "{ctrl down}{shift down}{]}{shift up}{ctrl up}{e}" : "{F2}"

3 (изменено: becauseim, 2015-08-29 01:39:46)

Re: AHK: Задание условия на нажатие клавиши

Круто! Работает! Большое спасибо!

4 (изменено: becauseim, 2015-08-29 01:39:32)

Re: AHK: Задание условия на нажатие клавиши

А скажете, как к такой форме добавить третье поочередное нажатие клавиши F2 для отправки нового сочетания клавиш в течение тех же двух секунд, но с момента второго нажатия?

5

Re: AHK: Задание условия на нажатие клавиши

becauseim, не нужно бессмысленно цитировать предыдущий пост.

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

6 (изменено: becauseim, 2015-08-29 01:40:05)

Re: AHK: Задание условия на нажатие клавиши

Согласен. Делаю это потому, что не нахожу кнопки "Ответить" (Пользователю).

7

Re: AHK: Задание условия на нажатие клавиши

becauseim, если вы не поняли, я к тому, что если будете продолжать так делать, получите бан. Кнопка «Ответить» находится под последним постом ветки. Хотите ответить кому-то конкретно, обращайтесь по нику.

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

8 (изменено: Irbis, 2015-08-29 02:28:26)

Re: AHK: Задание условия на нажатие клавиши

Заранее отвечу и про 4ое, и про 5ое подряд нажатия.

Count := 0, Period := 2000 ; 2сек.
Arr:= ["{F2}", "{ctrl down}{shift down}{]}{shift up}{ctrl up}{e}", "{F10}"]
$F2:: Send % Arr[Count := Count*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<Period))+1]

9 (изменено: becauseim, 2015-08-29 02:18:28)

Re: AHK: Задание условия на нажатие клавиши

Извиняюсь, а в которую область внести тот набор клавиш, который будет отправляться при третьем клике?
И почему-то в новом варианте требуемая операция перестала работать. Как с первым нажатием, так и со вторым.

10 (изменено: Irbis, 2015-08-29 02:22:04)

Re: AHK: Задание условия на нажатие клавиши

Вместо "{F10}".
Вторая строка - просто пример, можно удалить. При ее использовании посылаются клавиши 1,2,3... в любое поле ввода, например в блокнот. Не забудь раскомментировать 3ю строчку.

11

Re: AHK: Задание условия на нажатие клавиши

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

12

Re: AHK: Задание условия на нажатие клавиши

Внес необходимые параметры, почему-то не работает.

Count := 0, Period := 2000 ; 2сек.
Arr:= ["{F2}", "{shift down}{f2}{shift up}", "{ctrl down}{shift down}{]}{shift up}{ctrl up}{e}"]
$F2:: Send % Arr[Count := Count*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<Period))+1]

13

Re: AHK: Задание условия на нажатие клавиши

{F10} не во второй строке, а в третьей. А Ваши сочетания (были) закомментированы, потому что мне не на чем проверить ваше "шаманство", вот и проверяю в блокноте работу скрипта. Исправил код в посте#8, чтоб он вас не сбивал с толку.

14 (изменено: becauseim, 2015-08-29 02:33:06)

Re: AHK: Задание условия на нажатие клавиши

Irbis пишет:

не на чем проверить

Понял, извиняюсь. Тем не менее, сценарий не работает после ввода необходимых в него параметров, к сожалению. Что-то стоит поправить?

15 (изменено: Irbis, 2015-08-29 02:50:10)

Re: AHK: Задание условия на нажатие клавиши

У меня работает  на примере ТоталКоммандера с различными вариантами Ctrl + Shift + F1...F10.
А зачем эти сложности с {shift down}{f2}{shift up}, если можно  +{F2} ?

Попробуй такой вариант:

Count := 0, Period := 2000 ; 2сек.
Arr:= ["{F2}", "+{F2}", "^+{]}{e}"]
$F2:: SendInput % Arr[Count := Count*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<Period))+1]

Возможно, для правильной работы 3го сочетания, вне зависимости от раскладки клавиатуры, нужно будет использовать виртуальные коды клавиш, а не {]}{e}.

16

Re: AHK: Задание условия на нажатие клавиши

Опять же извиняюсь, перенес в отдельный файл ahk, заработало! Видимо конфликтовал в файле с остальными сриптами.
Записываю так, как мне подсказывает Macro Creator. Все-таки я лишь любитель скриптов, делаю ошибки. Возьму на заметку!

17

Re: AHK: Задание условия на нажатие клавиши

Irbis, столкнулся с проблемой. На основе Вашего сценария набрал две задачи на две разные горячие клавиши, разместив их в одном файле AHK. Работает только одна из них (первая), вторая же только при условии размещения и запуска ее в отдельном файле. Можно ли это как-то исправить?


Count := 0, Period := 1100
f6:= ["!{o}{r}{t}", "!{o}{r}{a}"]
$F6:: SendInput % f6[Count := Count*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<Period))+1]

Count := 0, Period := 1100
f10:= ["{!{t 2}{c}", "!{o}{k 2}{enter}{tab 3}"]
$F10:: SendInput % f10[Count := Count*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<Period))+1]

18

Re: AHK: Задание условия на нажатие клавиши

becauseim, раз у вас 2 хоткея, для каждого должен быть свой счетчик нажатий. И если клавиша не отсылает саму себя, т.е. при нажатии F10 не предусмотрен посыл F10, то "$" перед ней можно не ставить.

Count1 := 0, Count2 := 0, Period := 1100
f6:= ["!{o}{r}{t}", "!{o}{r}{a}"]
f10:= ["{!{t 2}{c}", "!{o}{k 2}{enter}{tab 3}"]

F6:: SendInput % f6[Count1 := Count1*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<Period))+1]
F10:: SendInput % f10[Count2 := Count2*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<Period))+1]

19

Re: AHK: Задание условия на нажатие клавиши

Irbis, хотел бы развить для себя эту полезную функцию, т.е. хотел бы узнать, как должен выглядеть скрипт, если, например, по первому нажатию отправляется сочетание клавиш, а по второму ControlClick или другая операция?

20

Re: AHK: Задание условия на нажатие клавиши

Count1 := 0, Count2 := 0, Period := 1100
f10:= ["{!{t 2}{c}", "!{o}{k 2}{enter}{tab 3}"]
F10:: SendInput % f10[Count2 := Count2*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<Period))+1]

Также оказалось необходимым добавить отдельную метку (SinglePress:, DoublePress:) к каждому действию в отдельности (действие по одинарному нажатию и по двойному), чтобы добавить соответствующие пункты в меню скрипта в трее. Надеюсь, кто-то подскажет, как это сделать.

21 (изменено: serzh82saratov, 2015-10-21 22:20:41)

Re: AHK: Задание условия на нажатие клавиши

Для любого количества клавиш и количества нажатий.
Ещё (возможно) плюс от предыдущего метода, что хоткеи не "скидывают" счётчики других хоткеев.


#UseHook
Delay := 1100
Arr := {1:{"LabelName":"Odin"}
        , "vk51":{LabelName:"Q"}}
        
For key in Arr 
{
    Hotkey, %key%, Work
    Arr[key][Count] := 0
}
Return

Work: 
    Arr[A_ThisHotkey][Count] := (A_TickCount - (Arr[A_ThisHotkey]["Time"]) < Delay) ? (Arr[A_ThisHotkey][Count] + 1) : 1
    Arr[A_ThisHotkey]["Time"] := A_TickCount 
    ; Раскоментировать, если при превышении лимита меток надо сразу запускать первую (зациклить).
    ; IsLabel(Arr[A_ThisHotkey]["LabelName"] "_" Arr[A_ThisHotkey][Count]) ? 0 : (Arr[A_ThisHotkey][Count] := 1)
    Try Gosub, % Arr[A_ThisHotkey]["LabelName"] "_" Arr[A_ThisHotkey][Count]
    Return
    
Odin_1:
Odin_2:
Odin_3:
Odin_4:
Q_1:
Q_2:
Q_3:
    ToolTip % A_ThisLabel
    Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22

Re: AHK: Задание условия на нажатие клавиши

К сожалению, без комментариев не понял, куда необходимо записывать значения переменных и где вставлять метки. Полагаю, это решение обоих вопросов? Т.е. как добавить вместо отправления клавиш иную команду и как добавить метки для каждой команды в отдельности. Могли бы Вы отредактировать его под конкретный пример? Например:
Одинарное нажатие на клавишу 1:

SinglePress:
Send ^+{Esc}

Двойное нажатие на клавишу 1:

DoublePress:
MsgBox, Hello!

Метки необходимы, чтобы создать для каждой команды отдельный пункт в TrayMenu.

23 (изменено: serzh82saratov, 2015-10-22 22:22:20)

Re: AHK: Задание условия на нажатие клавиши


#UseHook
Delay := 1100
Arr := {1:{"Label":"Odin"}}
        
For key in Arr  {
    Hotkey, %key%, Work
    Arr[key]["C"] := 0
}
Return

Work: 
    o := Arr[A_ThisHotkey], o["C"] := A_TickCount - o["T"] < Delay ? o["C"] + 1 : 1 
    o["T"] := A_TickCount, IsLabel(o["Label"] "_" o["C"]) ? 0 : (o["C"] := 1)
    Try Gosub, % o["Label"] "_" o["C"]
    Return
    
Odin_1:
    Send ^+{Esc}
    Return
    
Odin_2:
    MsgBox,,,Hello!,0.3
    Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24

Re: AHK: Задание условия на нажатие клавиши

serzh82saratov, Спасибо! Так понимаю, здесь уже исключена возможность включения/выключения цикличности, аналогично первому примеру? И самое главное, у меня не получилось задать несколько клавиш на основе Вашего кода в одном скрипте. Пробовал для другой клавиши менять названия Arr и Work, к сожалению, не получилось.

25

Re: AHK: Задание условия на нажатие клавиши

И самое главное, у меня не получилось задать несколько клавиш на основе Вашего кода в одном скрипте.

Всё также как и в 21 посте.


#UseHook
Delay := 1100
Arr := {1:{"Label":"Odin"}
        , "+vk51":{"Label":"Shift+Q"}}
        
For key in Arr  {
    Hotkey, %key%, Work
    Arr[key]["C"] := 0
}
Return

Work: 
    o := Arr[A_ThisHotkey], o["C"] := A_TickCount - o["T"] < Delay ? o["C"] + 1 : 1 
    IsLabel(o["Label"] "_" o["C"]) ? (o["T"] := A_TickCount) : 0
    ; Раскоментировать, если при превышении лимита меток надо сразу запускать первую (зациклить). 
    ; И закомментировать строку выше.
    ; o["T"] := A_TickCount, IsLabel(o["Label"] "_" o["C"]) ? 0 : (o["C"] := 1) 
    Try Gosub, % o["Label"] "_" o["C"]
    Return
    
Odin_1:
    Send ^+{Esc}
    Return
    
Odin_2:
    MsgBox,,,Hello!,0.3
    Return

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

26

Re: AHK: Задание условия на нажатие клавиши

Спасибо! Сейчас попробую! А если необходимо задать различное значение Delay для разных клавиш?

27

Re: AHK: Задание условия на нажатие клавиши

#UseHook 
Arr := {1:{"Label":"Odin", "Delay":1100}
        , "vk51":{"Label":"Q", "Delay":2200}}
        
For key in Arr  {
    Hotkey, %key%, Work
    Arr[key]["C"] := 0
}
Return

Work:
    o := Arr[A_ThisHotkey], o["C"] := A_TickCount - o["T"] < o["Delay"] ? o["C"] + 1 : 1 
    o["T"] := A_TickCount, IsLabel(o["Label"] "_" o["C"]) ? 0 : (o["C"] := 1) 
    ; Раскоментировать, если при превышении лимита надо ожидать "Delay" перед вызовом первой. 
    ; И закомментировать строку выше.
    ; IsLabel(o["Label"] "_" o["C"]) ? (o["T"] := A_TickCount) : 0
    Try Gosub, % o["Label"] "_" o["C"]
    Return
     
    
Odin_1:
Odin_2:
Odin_3:
Odin_4:
Q_1:
Q_2:
Q_3:
    MsgBox,,, % A_ThisLabel, 0.2
    Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

28

Re: AHK: Задание условия на нажатие клавиши

serzh82saratov, работает отлично! Но стоит добавить в конце, например, #IfWinActive, ahk_exe chrome.exe, для добавления другой части кода с условием его работы в отдельной программе, как сценарий перестает работать. При этом не возникает ошибок, а именно перестают быть активными заданные горячие клавиши. Не могу понять, почему так происходит.

29

Re: AHK: Задание условия на нажатие клавиши

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

30

Re: AHK: Задание условия на нажатие клавиши

Пример не рабочего надо увидеть.

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

31

Re: AHK: Задание условия на нажатие клавиши

#MaxHotkeysPerInterval 999
#SingleInstance Force
SetWorkingDir %A_ScriptDir%
SetTitleMatchMode 2
DetectHiddenWindows On
SendMode Input
SetKeyDelay -1

#IfWinActive, Vegas Pro 13.0

#UseHook
ArrVegas:=	{vk53:{"Label":"S", "Delay":250}
			, "F2":{"Label":"F2", "Delay":250}}
		
For key in ArrVegas  {
	Hotkey, %key%, Work
	ArrVegas[key]["C"] := 0
}
Return

Work:
	o := ArrVegas[A_ThisHotkey], o["C"] := A_TickCount - o["T"] < o["Delay"] ? o["C"] + 1 : 1 
	o["T"] := A_TickCount, IsLabel(o["Label"] "_" o["C"]) ? 0 : (o["C"] := 1) 
	; Раскоментировать, если при превышении лимита надо ожидать "Delay" перед вызовом первой. 
	; И закомментировать строку выше.
	; IsLabel(o["Label"] "_" o["C"]) ? (o["T"] := A_TickCount) : 0
	Try Gosub, % o["Label"] "_" o["C"]
	Return

S_1:
	SendInput !eee{Right}{Up 4}{Enter}
	Return

S_2:
	SendInput !eee{Right}n!tts
	Return

F2_1:
	SendInput !0^!+k
	Return
			
F2_2:						
	SendInput +^[{vk52}
	Return
	
#IfWinActive, ahk_exe notepad.exe

a:: Send b
b:: Send a

Сценарий работает без последних трех строк.

32

Re: AHK: Задание условия на нажатие клавиши

А что в последних не работает?

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

33

Re: AHK: Задание условия на нажатие клавиши

Не понял вопроса. Дело в том, что клавиши "S" и "F2" перестают работать тогда, когда в конце сценария появляется условие #IfWinActive

34

Re: AHK: Задание условия на нажатие клавиши

Не работают даже в окне вегаса?
Т.к. там:

#IfWinActive, Vegas Pro 13.0
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

35

Re: AHK: Задание условия на нажатие клавиши

Alectric, да, проверяю работоспособность только в окне Вегаса.

36 (изменено: serzh82saratov, 2015-11-14 13:11:46)

Re: AHK: Задание условия на нажатие клавиши


#SingleInstance Force
#HotkeyInterval 0
#UseHook
DetectHiddenWindows On
SetTitleMatchMode 2
SetWorkingDir %A_ScriptDir%
SendMode Input
SetKeyDelay -1

ArrVegas:=	{"vk53":{"Label":"S", "Delay":250}
			, "F2":{"Label":"F2", "Delay":250}}
			
Hotkey, IfWinActive, ahk_exe notepad++.exe  ;  Сюда прописать Vegas
		
For key in ArrVegas  {
	Hotkey, %key%, Work
	ArrVegas[key]["C"] := 0
}
Return

Work:
	o := ArrVegas[A_ThisHotkey], o["C"] := A_TickCount - o["T"] < o["Delay"] ? o["C"] + 1 : 1 
	o["T"] := A_TickCount, IsLabel(o["Label"] "_" o["C"]) ? 0 : (o["C"] := 1) 
	; Раскоментировать, если при превышении лимита надо ожидать "Delay" перед вызовом первой. 
	; И закомментировать строку выше.
	; IsLabel(o["Label"] "_" o["C"]) ? (o["T"] := A_TickCount) : 0
	Try Gosub, % o["Label"] "_" o["C"]
	KeyWait, % A_ThisHotkey
	Return

S_1:
	MsgBox, , , notepad++.exe, 0.3
	Return
	
#IfWinActive, ahk_exe notepad.exe
 
2:: MsgBox, , , простой блокнот, 0.3

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

37

Re: AHK: Задание условия на нажатие клавиши

Привет! Хотелось бы несколько модифицировать сценарий, а именно:

  • Исключить значение Delay, т.е. просто зациклить порядок отправления комманд при каждом нажатии на горячую клавишу, но в том случае, если между повторами была нажата любая другая клавиша, сбрасывать счетчик.
    Либо, насколько я понимаю, значение Delay можно не исключать, а просто задать ему большое значение, например, в минуту.

  • В том случае, если горячая клавиша была зажата, исключить зацикливание отправлений комманд, т.е. остановится на последней порядковой комманде. В отличие от простых повторов нажатия, когда комманды зациклены.
    Здесь, опять же, насколько я понимаю, значение Delay уже не исключить, т.к. необходимо установить промежуток времени, через который одна комманда будет сменять другую, но это ожидание не может быть долгим, как было упомянуто в первом пункте.

  • Установить положение, при котором заданная горячая клавиша не будет срабатывать при отправке этой клавиши командой Send(Input).
    Иными словами, при нажатии на клавишу "b" не должно выходить сообщение " Вы нажали на "А" " :

#SingleInstance Force

Arr:=	{vk41:{"Label":"A", "Delay":1000} ;		a
		, vk42:{"Label":"B", "Delay":1000}} ;	b	
		
		
For key in Arr  {
	Hotkey, %key%, Work
	Arr[key]["C"] := 0
}
Return

Work:
	o := Arr[A_ThisHotkey], o["C"] := A_TickCount - o["T"] < o["Delay"] ? o["C"] + 1 : 1 
	;~ o["T"] := A_TickCount, IsLabel(o["Label"] "_" o["C"]) ? 0 : (o["C"] := 1)			; No Wait "Delay"
	IsLabel(o["Label"] "_" o["C"]) ? (o["T"] := A_TickCount) : 0							; Wait "Delay"
	Try Gosub, % o["Label"] "_" o["C"]

A_1:
	MsgBox, Вы нажали на "А"
	return
	
A_2:
	SoundBeep, 9000
	return

B_1:
	SendInput a
	return

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

38 (изменено: serzh82saratov, 2015-11-14 13:12:32)

Re: AHK: Задание условия на нажатие клавиши

Установить положение, при котором заданная горячая клавиша не будет срабатывать при отправке этой клавиши командой Send(Input).
Иными словами, при нажатии на клавишу "b" не должно выходить сообщение " Вы нажали на "А" " :

на мой взгляд, я полностью повторил предложенный мне вариант сценария.

Как то очень не внимательно повторили. Где:

#HotkeyInterval 0
#UseHook
Try Gosub, % o["Label"] "_" o["C"]
Return 

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

Это поправил в предыдущем посте.

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

39

Re: AHK: Задание условия на нажатие клавиши

Исключить значение Delay, т.е. просто зациклить порядок отправления комманд при каждом нажатии на горячую клавишу, но в том случае, если между повторами была нажата любая другая клавиша, сбрасывать счетчик.
Либо, насколько я понимаю, значение Delay можно не исключать, а просто задать ему большое значение, например, в минуту.

При такой задаче Delay можно упразднить, надо только уточнить какие такие любые другие клавиши.

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

40 (изменено: becauseim, 2015-11-14 18:28:32)

Re: AHK: Задание условия на нажатие клавиши

serzh82saratov пишет:

Это поправил в предыдущем посте.

Я, наверное, неправильно выразился, необходимо, чтобы при зажатии отправлялось "123", без зацикливания:

A_1:
	SendInput 1
	return
	
A_2:
	SendInput 2
	return

A_2:
	SendInput 3
	return

Прокомментируйте, пожалуйста, строку (значение), в которой Вы отключили появление сообщения при нажатии на b.

serzh82saratov пишет:

надо только уточнить какие такие любые другие клавиши.

Любые другие, в том числе и другие горячие клавиши из данного сценария, а также клики мышью.

41

Re: AHK: Задание условия на нажатие клавиши

Можно ли исключить функцию gosub для каждой гк, т.е. заменить в содержании под лейблом Multikey значение arr на "клавиша, которая была нажата"?

Count := 0

s::
	arr:=["s", "ss"]
	gosub MultiKey
	return

d::
	arr:=["d", "dd", "ddd"]
	gosub MultiKey
	return

MultiKey:
	SendInput % arr[Count := Count*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<1000))+1]
	return

Имею представление о том, как заменить arr на "эта горячая клавиша":

Count := 0

s::
	%A_ThisHotkey%:=["s", "ss"]

	SendInput % %A_ThisHotkey%[Count := Count*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<1000))+1]
	return

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

	Count := 0
	
	s:=["s", "ss"]

	d:=["d", "dd", "ddd"]

	SendInput % %Клавиша, которая была нажата%[Count := Count*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<1000))+1]
	return

Также интересно, можно ли упразднить задание значения Count, если оно всегда, так или иначе, равно нулю?

42

Re: AHK: Задание условия на нажатие клавиши

ThisHotkey := "d", count := 2
Arr := {s:{1:"s", 2:"ss"}
      , d:{1:"d", 2:"dd", 3:"ddd"}}
SendInput % Arr[ThisHotkey][count]

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

43

Re: AHK: Задание условия на нажатие клавиши

Irbis, спасибо! Да, наверное, я не понимаю сути работы сценария. Подумал, что если значение Count равно нулю, то задавать его нет необходимости. А последний предложенный Вами скрипт после запуска отправляет две буквы "d" и закрывается, т.е. срабатывает не по горячим клавишам.

44

Re: AHK: Задание условия на нажатие клавиши

Конечно, это же не полный код, а лишь пример, как в SendInput совместить название нажатой клавиши (в твоем примере это A_ThisHotkey) и счетчик количества нажатий.

45

Re: AHK: Задание условия на нажатие клавиши

Irbis, к сожалению, могу воспринимать в качестве примеров лишь законченные рабочие сценарии, если Вам не сложно, не могли бы Вы отредактировать последний вариант так, чтобы как и прежде, заданные в списке клавиши срабатывали аналогично прежнему варианту, т.е. чтобы при тройном нажатии на "d" отправлялась вначале одна буква "d", потом две, потом еще три (всего шесть), при двойном нажатии предполагается получить три буквы соответственно.

46

Re: AHK: Задание условия на нажатие клавиши

Count := 0
Arr := {"$s":{1:"s", 2:"ss"}
      , "$d":{1:"d", 2:"dd", 3:"ddd"}}
Return

$s::
$d::
   SendInput % Arr[A_ThisHotkey][Count := Count*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<1000))+1]
Return

47 (изменено: becauseim, 2015-12-04 18:52:03)

Re: AHK: Задание условия на нажатие клавиши

Спасибо!

48

Re: AHK: Задание условия на нажатие клавиши

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

#SingleInstance Force

/*
[Section]
Mode=1
[End]
*/

Count := 0
Arr := {"$f12":{1:"!{vk54 2}{vk43}"
			  , 2:"!{vk4F}{vk4B 2}{Enter}{Tab}"}
		, "$s":{1:"!{vk45}{Up 9}{Right}{vk53}"
			  , 2:"!{vk54 2}{vk43}!{vk45 3}{Right}{vk4E}!{vk54 2}"}

If Mode = 1
, "$f2":{1:"{vk4B}"
,		 2:"^!+{vk4B}"
,		 3:"+^{vkDB}{vkC0}{vk52}"}

else if Mode = 2					
, "$f2":{1:"^!+{vk4B}"
, 		 2:"+^{vkDB}{vkC0}{vk52}"}}
Return

$s::
$f12::
$f2::
   SendInput % Arr[A_ThisHotkey][Count := Count*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<250))+1]
Return

^F1:: IniWrite, % (Mode := 1), %A_ScriptFullPath%, Section, Mode 
^F2:: IniWrite, % (Mode := 2), %A_ScriptFullPath%, Section, Mode

49

Re: AHK: Задание условия на нажатие клавиши

Я бы удивился, если бы If заработал внутри объявления массива Arr. Да и автор AHK тоже, наверное. ))
Такой вариант. К каждому названию горячей внутри массива Arr добавлен режим, в котором клавиша будет работать - то есть f21 и f22 работают в 1 и 2 режиме соответственно, а s0 и f120- независимо от режима.

#SingleInstance Force

/*
[Section]
Mode=2
[End]
*/

Count := 0
IniRead, Mode, %A_ScriptFullPath%, Section, Mode
Arr := {"$f120":{1:"!{vk54 2}{vk43}"               ; Mode 0
                ,2:"!{vk4F}{vk4B 2}{Enter}{Tab}"}
		,"$s0":{1:"!{vk45}{Up 9}{Right}{vk53}"     ; Mode 0
		       ,2:"!{vk54 2}{vk43}!{vk45 3}{Right}{vk4E}!{vk54 2}"}
	   ,"$f21":{1:"{vk4B}"                        ; Mode = 1
	          ,2:"^!+{vk4B}"
			  ,3:"+^{vkDB}{vkC0}{vk52}"} 
      ,"$f22":{1:"^!+{vk4B}"                      ; Mode = 2 
	          ,2:"+^{vkDB}{vkC0}{vk52}"}}             
Return

$s::
$f12::
$f2::
   Key := A_ThisHotkey . Arr.HasKey(A_ThisHotkey Mode)*Mode
   ,Count := Count*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<250))+1
   SendInput % Arr[Key][Count]
Return

^F1:: IniWrite, % (Mode := 1), %A_ScriptFullPath%, Section, Mode 
^F2:: IniWrite, % (Mode := 2), %A_ScriptFullPath%, Section, Mode

50

Re: AHK: Задание условия на нажатие клавиши

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

$s::
$f12::
$f2::

на функцию, определяющую нажатаю клавишу, подобно этому методу? Этот момент не принципиален, конечно, но очень интересен, т.к. позволит не задавать повторное перечисление клавиш.

51 (изменено: becauseim, 2015-12-06 03:01:07)

Re: AHK: Задание условия на нажатие клавиши

Еще, ранее serzh82saratov предложил способ задания величины параметра A_TimeSincePriorHotkey для каждой клавиши в отдельности, но думаю, было бы еще лучше иметь возможность задавать этот параметр лишь для некторых клавиш (сразу после Arr := {"$f120"...), а для клавиш без заданной величины A_TimeSincePriorHotkey оставить значение по умолчанию, т.е. 250. Можно ли добавить такое условие?

upd.: Также заметил, что клавиша, к сожалению, не срабатывает, если заменить ее на виртуальный код.

52 (изменено: becauseim, 2015-12-13 13:23:51)

Re: AHK: Задание условия на нажатие клавиши

Irbis, пожалуйста, подскажите, как в Вашем последнем варианте заменить переменные значения SendInput на WinMenuSelectItem?
Т.е. необходимо по одиночному нажатию горячей клавиши отправлять:

WinMenuSelectItem, Vegas, , Tools, Scripting, Rescan Scrippt Menu Folder

по двойному::

WinMenuSelectItem, Vegas, , Options, Customize Keyboard
#SingleInstance Force
SetTitleMatchMode, 2

/*
[Section]
Mode=1
[End]
*/

IniRead, Mode, %A_ScriptFullPath%, Section, Mode 

Count := 0


Arr := {"$f120": {1:"Tools, Scripting, Rescan Scrippt Menu Folder", 2:"Options, Customize Keyboard"}}
Return

$f12::
   Key := A_ThisHotkey . Arr.HasKey(A_ThisHotkey Mode)*Mode
   ,Count := Count*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<250))+1
   WinMenuSelectItem, Vegas, , % Arr[Key][Count]
Return

^F1:: IniWrite, % (Mode := 1), %A_ScriptFullPath%, Section, Mode 
^F2:: IniWrite, % (Mode := 2), %A_ScriptFullPath%, Section, Mode

Еще лучше было бы иметь возможность по одиночному нажатию отправлять SendInput , а по двойному WinMenuSelectItem.

53

Re: AHK: Задание условия на нажатие клавиши

И все-таки, можно ли здесь заменить SendInput на WinMenuSelectItem?

F1::
	Count := 0
	arr:= ["^s", "^o"]
	; arr:= ["File, Save", "File, Open..."]
SendInput % arr[Count := Count*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<1000))+1]
; WinMenuSelectItem, Notepad, , % ?????
	return

54 (изменено: Malcev, 2015-12-16 18:40:31)

Re: AHK: Задание условия на нажатие клавиши

Например так:

F1::
arr:= ["File", "Open..."]
WinMenuSelectItem, Notepad, , % arr[1], % arr[2]
return

Либо так:

F1::
arr:= ["File,Save", "File,Open..."]
StringSplit, arr_arr, % arr[2],`,
WinMenuSelectItem, Notepad, , % arr_arr1, % arr_arr2
return

55

Re: AHK: Задание условия на нажатие клавиши

Malcev, Спасибо большое! А можно ли добавить проверку на то, что если в одном из параметров имеются слова File, Edit, View.. , то отправлять команду WinMenuSelectItem, иначе SendInput ?

F1::
	Count := 0
	arr:= ["^s", "File, Open..."]
	; if ???
	SendInput % arr[Count := Count*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<1000))+1]
	; else
	; WinMenuSelectItem, Notepad, , % arr[1], % arr[2]
	return

56 (изменено: Malcev, 2015-12-17 13:28:21)

Re: AHK: Задание условия на нажатие клавиши

Не проще ли пользоваться таким кодом?

F11::
ToolTip
KeyWait, %A_ThisHotkey%
KeyWait, %A_ThisHotkey%, D T0.1
If ErrorLevel
   ToolTip Send
Else
   ToolTip WinMenuSelectItem
KeyWait, %A_ThisHotkey%
Return

Или исходя из вашего алгоритма нажатия, то так:

F11::
ToolTip
If (A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<1000)
   ToolTip Send
Else
   ToolTip WinMenuSelectItem
Return

57

Re: AHK: Задание условия на нажатие клавиши

Malcev, не могли бы Вы отредактировать предложенные сценарии на основе поста №55? Не понятно, где необходимо ввести переменные значения.

Не проще ли пользоваться таким кодом?

Не знаю, пока не получилось попробовать, а вообще, речь идет о мультизадачности клавиши, где в зависимости от количества нажатий клавиши (у меня это значение в среднем равно 2-4), отправвляется различное число комманд (вначале первое значение переменной, затем последующее).

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

58 (изменено: Malcev, 2015-12-17 21:40:49)

Re: AHK: Задание условия на нажатие клавиши

Кажется понял, что вы хотите добиться:

f10::
f11::
f12::
if (A_ThisHotkey = "f10")
   count := 2, time := 250
if (A_ThisHotkey = "f11")
   count := 3, time := 1000
if (A_ThisHotkey = "f12")
   count := 4, time := 2000
If (n < count)&&(A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<time)
   n++
else
   n := 1
if n = 1
{
   if (A_ThisHotkey = "f10")
      ToolTip 1 "f10"
   if (A_ThisHotkey = "f11")
      ToolTip 1 "f11"
   if (A_ThisHotkey = "f12")
      ToolTip 1 "f12"
}
if n = 2
{
   if (A_ThisHotkey = "f10")
      ToolTip 2 "f10"
   if (A_ThisHotkey = "f11")
      ToolTip 2 "f11"
   if (A_ThisHotkey = "f12")
      ToolTip 2 "f12"
}
if n = 3
{
   if (A_ThisHotkey = "f11")
      ToolTip 3 "f11"
   if (A_ThisHotkey = "f12")
      ToolTip 3 "f12"
}
if n = 4
{
   if (A_ThisHotkey = "f12")
      ToolTip 4 "f12"
}
KeyWait, % A_ThisHotkey
return

59

Re: AHK: Задание условия на нажатие клавиши

Malcev, спасибо! Ваш метод тоже имеет свои плюсы, но подобное уже реализовано пользователем serzh82saratov в 27-ом посте. Только Ваш сценарий при зажатии клавиши отправляет лишь значение, заданное на одинарное нажатие. А в том варианте команды при зажатии клавиши, насколько я помню, отправлялись по циклу. Мне же было необходимо, чтобы при зажатии были отправлены все заданные значения, но без зацикливания, как в следующем варианте, предложенном пользователем Irbis, но сейчас хотелось бы внести в него дополнительные параметры, обозначенные в комментариях к коду:

F1::
	Count := 0
	arr:= ["^s", "File, Open..."]
	; если в параметре переменной имеются слова File, Edit, View.. , то отправлять команду WinMenuSelectItem
	WinMenuSelectItem, Notepad, , % arr[1], % arr[2]
	;  иначе, SendInput
	SendInput % arr[Count := Count*((A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<1000))+1]
	return

60

Re: AHK: Задание условия на нажатие клавиши

Вот так будет работать при зажатии до конца цикла:

f10::
f11::
f12::
if (A_ThisHotkey = "f10")
   count := 2, time := 250
if (A_ThisHotkey = "f11")
   count := 3, time := 1000
if (A_ThisHotkey = "f12")
   count := 4, time := 2000
If (n < count)&&(A_PriorHotkey = A_ThisHotkey)&&(A_TimeSincePriorHotkey<time)
   n++
else
   n := 1
if n = 1
{
   if (A_ThisHotkey = "f10")
      ToolTip 1 "f10"
   if (A_ThisHotkey = "f11")
      ToolTip 1 "f11"
   if (A_ThisHotkey = "f12")
      ToolTip 1 "f12"
}
if n = 2
{
   if (A_ThisHotkey = "f10")
      ToolTip 2 "f10"
   if (A_ThisHotkey = "f11")
      ToolTip 2 "f11"
   if (A_ThisHotkey = "f12")
      ToolTip 2 "f12"
}
if n = 3
{
   if (A_ThisHotkey = "f11")
      ToolTip 3 "f11"
   if (A_ThisHotkey = "f12")
      ToolTip 3 "f12"
}
if n = 4
{
   if (A_ThisHotkey = "f12")
      ToolTip 4 "f12"
}
If (n = count)
   KeyWait, % A_ThisHotkey
return

61

Re: AHK: Задание условия на нажатие клавиши

Count := 0

f2::
arr:=["1", "2", "3"]
gosub % arr[Count := Count*((A_PriorHotkey = A_ThisHotkey))+1]
return

1:
ToolTip 1
return
2:
ToolTip 2
return
3:
ToolTip 3
return

Помогите, пожалуйста, установить сброс счетчика нажатий при условии, если между повторами была нажата любая другая клавиша, отличная от горячей, а также исключить ошибку "Target label does not exist" при превышении количества нажатий над количеством заданных лейблов.

62

Re: AHK: Задание условия на нажатие клавиши

#InstallKeybdHook
Count := 0

f2::
arr:=["1", "2", "3"]
if (A_PriorKey != A_ThisHotkey) or (count = arr.Length())
   count := 0
gosub % arr[Count := Count*((A_PriorHotkey = A_ThisHotkey))+1]
return

1:
ToolTip 1
return
2:
ToolTip 2
return
3:
ToolTip 3
return

63

Re: AHK: Задание условия на нажатие клавиши

Malcev, спасибо! Работает, как и хотелось, правда, клики мышью не срабатывают в качестве "любых других клавиш", но в этом нет острой необходимости. Хотелось бы сохранив функциональность этого скрипта, добавить другие клавиши c их определением. Т.е. используя в начале сценария что-то подобное:


Input, key, L1
if (key = "f2") {
arr := ["f2_1","f2_2","f2_3"]
}
else if (key = "q") {
arr := ["q_1","q_2","q_3"]
}

Можно ли это реализовать?

64

Re: AHK: Задание условия на нажатие клавиши

В 60 посте я уже писал:

f2::
q::
if (A_ThisHotkey = "f2")
   arr := ["f2_1","f2_2","f2_3"]
if (A_ThisHotkey = "q")
   arr := ["q_1","q_2","q_3"]
msgbox % arr[1]

65

Re: AHK: Задание условия на нажатие клавиши

Malcev, да, помню. И все-таки, возможно ли определить нажатую клавишу иным способом, кроме A_ThisHotKey, например, при помощи input, как в этом примере (правда, в нем у меня не срабатывает клавиша f2)?

Loop
{
Input, key, V L1
gosub % key
}

q:
ToolTip q
return
w:
ToolTip w
return
e:
ToolTip e
return

Если это невозможно, то почему?

66 (изменено: becauseim, 2016-01-04 04:35:26)

Re: AHK: Задание условия на нажатие клавиши

Malcev, Как избежать простоя при двойном нажатии, если в заданном режиме (Mode = 2) вызова комманды при двойном нажатии не требуется?

#InstallKeybdHook

/*
[Section]
Mode=2
[End]
*/

IniRead, Mode, %A_ScriptFullPath%, Section, Mode
   
1::
if (A_ThisHotkey = "1")
arr := ["1_1","1_2"]
if (A_PriorKey != A_ThisHotkey) or (Count = arr.Length())
Count := 0
gosub % arr[Count := Count*((A_PriorHotkey = A_ThisHotkey))+1]
return
    
1_1:
if Mode = 1
{
	ToolTip Single (Mode = 1)
}
if Mode = 2
{
	ToolTip Single (Mode = 2)
}
Return

1_2:
if Mode = 1
{
	ToolTip Double (Mode = 1)
}
Return

^f1:: IniWrite, % (Mode := 1), %A_ScriptFullPath%, Section, Mode 
^f2:: IniWrite, % (Mode := 2), %A_ScriptFullPath%, Section, Mode

67

Re: AHK: Задание условия на нажатие клавиши

Не понимаю, что вы хотите добиться.

68 (изменено: becauseim, 2016-01-04 22:52:42)

Re: AHK: Задание условия на нажатие клавиши

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

В общем, преследуется возможность установить мультизадачность горячих клавиш, основанную на следующих принципах:

  • С каждым новым нажатием на горячую клавишу отправлять следующую заданную в лейбле команду, вне зависимости от того, в какой промежуток времени повторно нажималась клавиша.

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

  • Команда должна отправляться в момент нажатия клавиши, не в момент ее отпускания.

  • (Опционально) Иметь возможность установить отправление команды при зажатии горячей клавиши на 1/10 секунды.

  • Если команды на зажатие заданной горячей клавиши установлено не было, либо таковой возможности сценарием все же не предусмотрено, то при зажатии горячей клавиши, отправить комманды по порядку и остановится на последней порядковой комманде, т.е. исключить зацикливание.

  • (Опционально) Возвращаясь к посту #65, хотелось бы для себя уяснить, можно ли заменить начальную часть скрипта с перечислением всех заданных горячих клавиш на функцию, определяющую нажатую в текущий момент клавишу.

+ открыть спойлер

Хотелось бы, чтобы сценарий был основан либо на модификации варианта от Irbis:

Count := 0
Arr:= ["f1_1", "f1_2", "f1_3"]
$f1:: gosub % Arr[Count := Count*((A_PriorHotkey = A_ThisHotkey))+1]

Либо на основе варианта от serzh82saratov (здесь добавлены примеры лейблов и режимы):


#UseHook 
/*
[Section]
Mode=1
*/
IniRead, Mode, %A_ScriptFullPath%, Section, Mode 

Arr:={f1:{"Label":"f1"}, f2:{"Label":"f2"}}

For key in Arr  {
    Hotkey, %key%, Work
    Arr[key]["C"] := 0
}
Return

Work:
    o := Arr[A_ThisHotkey], o["C"] := A_TickCount - o["T"] < o["Delay"] ? o["C"] + 1 : 1 
    o["T"] := A_TickCount, IsLabel(o["Label"] "_" o["C"]) ? 0 : (o["C"] := 1) 
    Try Gosub, % o["Label"] "_" o["C"]
    Return

f1_1: ; первое нажатие
ToolTip f1*1
return

f1_2: ; второе нажатие
ToolTip f1*2
return

f2_1: ; первое нажатие
if Mode = 1
	{
		ToolTip f2*1(Mode=1)
	}
else if Mode = 2
	{
		ToolTip f2*1(Mode=2)
	}
return

f2_2: ; второе нажатие
if Mode = 1
	{
		ToolTip f2*2(Mode=1)
	}
else if Mode = 2
	{
		ToolTip f2*2(Mode=2)
	}
return

^f1:: IniWrite, % (Mode := 1), %A_ScriptFullPath%, Section, Mode 
^f2:: IniWrite, % (Mode := 2), %A_ScriptFullPath%, Section, Mode

69

Re: AHK: Задание условия на нажатие клавиши

Мне кажется, что вам необходимо изучить таки синтаксис ahk.
Так как эти условия вы можете добавлять сами:

#InstallKeybdHook
#InstallMouseHook
Count := 0
f2::
arr:=["1", "2", "3"]
if (A_TimeSincePriorHotkey < 50) and (A_TimeSincePriorHotkey != -1) and (count = arr.Length())
   return
If (A_PriorKey != A_ThisHotkey) or (count = arr.Length())
   count := 0
gosub % arr[Count := Count*((A_PriorHotkey = A_ThisHotkey))+1]
return

1:
ToolTip 1
return
2:
ToolTip 2
return
3:
ToolTip 3
return

На счет Input, можно наверное, но зачем городить огород?

Loop
{
   Input, key, V L1, {f1}
   if (key = "")
      key := RegExReplace(ErrorLevel, "^EndKey:")
   if key in q,w,e,f1
      GoSub %key%
}

q:
ToolTip q
return
w:
ToolTip w
return
e:
ToolTip e
return
f1:
ToolTip f1
return


q::
w::
e::
f1::
return

70 (изменено: becauseim, 2016-01-05 01:51:28)

Re: AHK: Задание условия на нажатие клавиши

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

f1::
f2::
if (A_ThisHotkey = "f2")
arr:=["f2_1", "f2_2", "f2_3"]
if (A_ThisHotkey = "f1")
arr:=["f1_1", "f1_2", "f1_3"]

Можно ли реализовать здесь задание этих переменных на что-то схожее с этим:

Arr:={f1:{"Label":"f1"}, f2:{"Label":"f2"}}

P.S.: Здесь реализована возможность добавления действия на зажатие клавиши?

71

Re: AHK: Задание условия на нажатие клавиши

Проверить зажата ли клавиша можно так:

f2::
KeyWait, %A_ThisHotkey%, T0.1
If ErrorLevel
   msgbox зажата

Можно ли реализовать здесь задание этих переменных на что-то схожее с этим:

Наверняка можно, но зачем?

72 (изменено: becauseim, 2016-01-05 04:46:43)

Re: AHK: Задание условия на нажатие клавиши

Malcev пишет:

Наверняка можно, но зачем?

Для лаконичности.

#InstallKeybdHook
#InstallMouseHook
Count := 0
f1::
f2::
if (A_ThisHotkey = "f2")
arr:=["f2_1", "f2_2", "f2_3"]
if (A_ThisHotkey = "f1")
arr:=["f1_1", "f1_2", "f1_3"]
if (A_TimeSincePriorHotkey < 50) and (A_TimeSincePriorHotkey != -1) and (count = arr.Length())
   return
If (A_PriorKey != A_ThisHotkey) or (count = arr.Length())
   count := 0
gosub % arr[Count := Count*((A_PriorHotkey = A_ThisHotkey))+1]
KeyWait, %A_ThisHotkey%, T0.2
If ErrorLevel
   ToolTip зажата
return

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

73 (изменено: Malcev, 2016-01-05 06:15:22)

Re: AHK: Задание условия на нажатие клавиши


#InstallKeybdHook
#InstallMouseHook
Count := 0
f1::
f2::
KeyWait, %A_ThisHotkey%, T0.2
If ErrorLevel
   ToolTip зажата
if (A_ThisHotkey = "f2")
arr:=["f2_1", "f2_2", "f2_3"]
if (A_ThisHotkey = "f1")
arr:=["f1_1", "f1_2", "f1_3"]
If (A_PriorKey != A_ThisHotkey) or (count = arr.Length())
   count := 0
gosub % arr[Count := Count*((A_PriorHotkey = A_ThisHotkey))+1]
return

74

Re: AHK: Задание условия на нажатие клавиши

Malcev, к сожалению, команды отправляются в цикле.

75

Re: AHK: Задание условия на нажатие клавиши

Тогда объясните, что вы хотите.

76 (изменено: becauseim, 2016-01-06 00:10:32)

Re: AHK: Задание условия на нажатие клавиши

Malcev, к Вашему варианту из 69 поста хотелось бы добавить возможность дополнительно установить действие на зажатие, иными словами, если параметр KeyWait установлен только на клавишу f2, то при ее зажатии на 0,2 секунды проверяется только зажатие, если параметра не установлено, то при зажатии по-прежнему проверяется весь порядок заданных комманд и останавливается на последней (что уже реализовано).

77 (изменено: Malcev, 2016-01-06 04:35:35)

Re: AHK: Задание условия на нажатие клавиши

#InstallKeybdHook
#InstallMouseHook
Count := 0
f1::
f2::
push := ""
if (A_ThisHotkey = "f2")
{
   push := 1
   arr:=["1", "2", "3"]
}
if (A_ThisHotkey = "f1")
   arr:=["4", "5", "6"]
If (A_PriorKey != A_ThisHotkey)
   pushArr := "", count := 0
if (push = 1) or (count +1 = arr.Length())
{
   KeyWait, %A_ThisHotkey%, T0.2
   If ErrorLevel
   {
      if (push = 1)
      {
         ToolTip зажата
         push := ""
         KeyWait, %A_ThisHotkey%
         return
      }
      else
         pushArr := 1
   }
}
If (count = arr.Length())
{
   if (pushArr = 1)
   {
      pushArr := ""
      KeyWait, %A_ThisHotkey%
      return
   }
   else
      count := 0
}
gosub % arr[Count := Count*((A_PriorHotkey = A_ThisHotkey))+1]
return


1:
ToolTip 1
return
2:
ToolTip 2
return
3:
ToolTip 3
return
4:
ToolTip 4
return
5:
ToolTip 5
return
6:
ToolTip 6
return

78

Re: AHK: Задание условия на нажатие клавиши

Malcev, Спасибо! Не знаю, как правильно описать следующее положение, в общем, при зажатии заданной клавиши через раз проскакивает задача, установленная на эту клавишу по умолчанию. Т.е. если в этом скрипте в качестве мультизадачной я использую клавишу f2, то проскакивает команда на переименование выделенного в программе элемента, т.к. по умолчанию, на эту клавишу в программе установлена эта команда. Реально ли как-то обойти этот момент? Например, используя Ваш вариант из 69 поста, такого положения не возникает.

79 (изменено: Malcev, 2016-01-09 07:35:01)

Re: AHK: Задание условия на нажатие клавиши

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

80 (изменено: becauseim, 2016-01-09 22:27:29)

Re: AHK: Задание условия на нажатие клавиши

Malcev, не знаю, как запустить от админа. А программа Vegas Pro, Вам знакома. При задержке клавиши на выделенном фрагменте видео, пытается его переименовать. Конечно, я могу убрать клавишу из стандартных настроек программы, но хотелось бы ограничиться средствами AHK.

81 (изменено: Malcev, 2016-01-10 18:12:07)

Re: AHK: Задание условия на нажатие клавиши

У меня скрипт 77 в в win8 в вегасе 13 при зажатии f2  ничего не переименовывает.
Запускать от админа - правая кнопка мыши run as administrator.

82

Re: AHK: Задание условия на нажатие клавиши

Malcev,  а при быстром нажатии на клавишу f2 у Вас не выполняется переименование? Потому что у меня при быстром нажатии стабильно выходит попытка переименовать фрагмент, даже после запуска упрощенного (без ф-ии задержания) скрипта 69 от администратора.

83

Re: AHK: Задание условия на нажатие клавиши

Нет, не выполняется.

84 (изменено: becauseim, 2016-01-12 05:52:18)

Re: AHK: Задание условия на нажатие клавиши

Malcev, понял, дело во внутренних скриптах Вегаса, выполнение которых я использую на нажатия клавиши. Заменил их на проверочные ToolTip'ы, попытка переименования не выходит. Реально ли как-то обойти этот момент средствами AHK?

К слову, скрипты вызываю с помощью WinMenuSelectItem.

85

Re: AHK: Задание условия на нажатие клавиши

Не знаю. С Вегасом знаком только поверхностно.

86

Re: AHK: Задание условия на нажатие клавиши

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

#SingleInstance Force
#InstallKeybdHook
#InstallMouseHook
1::
arr:=["1", "2", "3"]
if (A_TimeSincePriorHotkey < 50) and (A_TimeSincePriorHotkey != -1) and (count = arr.Length())
   return
If (A_PriorKey != A_ThisHotkey) or (count = arr.Length())
   count := 0
gosub % arr[Count := Count*((A_PriorHotkey = A_ThisHotkey))+1]
return

1:
2:
3:
ToolTip % a_thislabel
return

4:
MsgBox % a_thislabel
return

Такой вариант не подходит:

2:
gosub 4
ToolTip % a_thislabel
return
+ Для чего это нужно:

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

1::
arr:= ["1", "2", "3"]
if (A_TimeSincePriorHotkey < 50) and (A_TimeSincePriorHotkey != -1) and (count = arr.Length())
   return
If (A_PriorKey != A_ThisHotkey) or (count = arr.Length())
   count := 0
gosub % arr[Count := Count*((A_PriorHotkey = A_ThisHotkey))+1]
return

1:
2:
3:
ToolTip % a_thislabel
return

А так в результате зажатия метки выполняются по кругу (где метка "Analyze" должна выполняться на ряду с меткой "1"):

1::
arr:= ["1", "2", "3"]
if (A_TimeSincePriorHotkey < 50) and (A_TimeSincePriorHotkey != -1) and (count = arr.Length())
   return
If (A_PriorKey != A_ThisHotkey) or (count = arr.Length())
   count := 0
gosub % arr[Count := Count*((A_PriorHotkey = A_ThisHotkey))+1]
gosub Analyze
return

1:
2:
3:
ToolTip % a_thislabel
return

Analyze:
MouseGetPos, FXClipX, FXClipY
ImageSearch, AnalyzeX, AnalyzeY, 0, 0, A_ScreenWidth, A_ScreenHeight, %A_ScriptDir%\Analyze.png
If ErrorLevel = 0
	MouseClick, , %AnalyzeX%, %AnalyzeY%, 1 ,0.5
MouseMove, %FXClipX%, %FXClipY%, 0.5
return

87

Re: AHK: Задание условия на нажатие клавиши

Мне лично ничего не понятно.
Почему не подходит GoSub?

88 (изменено: becauseim, 2016-06-07 19:23:24)

Re: AHK: Задание условия на нажатие клавиши

Malcev, в приведенном варианте каждое нажатие горячей клавиши переходит к определенной (одной) метке. Необходима возможность устанавливать неограниченное кол-во меток на каждое нажатие. При этом, по-прежнему, при зажатии горячей клавиши, сценарий должен пройти поочередно все метки и остановиться на последней.

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

89

Re: AHK: Задание условия на нажатие клавиши

Если брать за основу код из 69 поста, то можно так:

#SingleInstance Force
#InstallKeybdHook
#InstallMouseHook
Count := 0
f1::
arr:=["1,1_1,1_2", "2,2_1", "3"]
if (A_TimeSincePriorHotkey < 50) and (A_TimeSincePriorHotkey != -1) and (count = arr.Length())
   return
If (A_PriorKey != A_ThisHotkey) or (count = arr.Length())
   count := 0
array := arr[Count := Count*((A_PriorHotkey = A_ThisHotkey))+1]
loop, parse, array, `,
{
   gosub % A_LoopField
   sleep 500
}
return

1:
ToolTip % a_thislabel
return
1_1:
ToolTip % a_thislabel
return
1_2:
ToolTip % a_thislabel
return
2:
ToolTip % a_thislabel
return
2_1:
ToolTip % a_thislabel
return
3:
ToolTip % a_thislabel
return

90

Re: AHK: Задание условия на нажатие клавиши

Malcev, спасибо! Только при зажатии клавиши метки проверяются циклично. Необходимо остановится на последней, т.е. в данном случае, на метке "3".

91

Re: AHK: Задание условия на нажатие клавиши

#SingleInstance Force
#InstallKeybdHook
#InstallMouseHook
Count := 0
f1::
arr:=["1,1_1,1_2", "2,2_1", "3"]
If (A_PriorKey != A_ThisHotkey)
   count := 0
array := arr[Count := Count*((A_PriorHotkey = A_ThisHotkey))+1]
loop, parse, array, `,
{
   gosub % A_LoopField
   sleep 200
}
if (count  = arr.Length())
{
   count := 0
   KeyWait % A_ThisHotkey
   return
}
return

1:
ToolTip % a_thislabel
return
1_1:
ToolTip % a_thislabel
return
1_2:
ToolTip % a_thislabel
return
2:
ToolTip % a_thislabel
return
2_1:
ToolTip % a_thislabel
return
3:
ToolTip % a_thislabel
return

А зачем нужна эта строчка?

if (A_TimeSincePriorHotkey < 50) and (A_TimeSincePriorHotkey != -1) and (count = arr.Length())
   return

92

Re: AHK: Задание условия на нажатие клавиши

Malcev, спасибо, работает!

А зачем нужна эта строчка?

К сожалению, не знаю.

93 (изменено: becauseim, 2018-03-02 01:18:54)

Re: AHK: Задание условия на нажатие клавиши

Malcev, подскажите, пожалуйста, как добавить последний вариант в ф-ию? Ниже нерабочая попытка.

#SingleInstance Force

f2:: 
MultikeyReset("{vk4B}", "{vk44}+{5}+{9}+{3}", "{vk58}^+{vk41}")
return

MultikeyReset(arr1, arr2, arr3){
#InstallKeybdHook
#InstallMouseHook
   count := 0
arr:=[arr1, arr2, arr3]
If (A_PriorKey != A_ThisHotkey)
   count := 0
array := arr[Count := Count*((A_PriorHotkey = A_ThisHotkey))+1]
loop, parse, array, `,
{
   SendInput % A_LoopField
   sleep 200
}
if (count  = arr.Length())
{
   count := 0
   KeyWait % A_ThisHotkey
   return
}
}
return

94

Re: AHK: Задание условия на нажатие клавиши

Не подскажу, так как не понимаю, что вы хотите добиться и чем вас не устраивает вариант без функции.

95

Re: AHK: Задание условия на нажатие клавиши

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

96

Re: AHK: Задание условия на нажатие клавиши

Используйте за основу код из 60 поста.

97

Re: AHK: Задание условия на нажатие клавиши

Malcev, он, по всей видимости, работает без учета нюансов, которые были описаны позже. Последний вариант невозможно заключить в ф-ию?

98

Re: AHK: Задание условия на нажатие клавиши

За компьютером буду нескоро. Можете попробовать вынести из функции переменную count в начало скрипта и обьявить ее глобальной. Ну и директивы тоже вынести.

99

Re: AHK: Задание условия на нажатие клавиши

Malcev, какие параметры данного скрипта являются директивами?

100

Re: AHK: Задание условия на нажатие клавиши

Директивы выделяются символом #.