26

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

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

Win10x64, AHK v1.1.25

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
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

28

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

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

Win10x64, AHK v1.1.25

29

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

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

Win10x64, AHK v1.1.25

30

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

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

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

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

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

Win10x64, AHK v1.1.25

32

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

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

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

33

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

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

Win10x64, AHK v1.1.25

34

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

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

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

35

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

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

Win10x64, AHK v1.1.25

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
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

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

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

Win10x64, AHK v1.1.25

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
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

39

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

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

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

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

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 пишет:

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

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

Win10x64, AHK v1.1.25

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, если оно всегда, так или иначе, равно нулю?

Win10x64, AHK v1.1.25

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" и закрывается, т.е. срабатывает не по горячим клавишам.

Win10x64, AHK v1.1.25

44

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

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

45

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

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

Win10x64, AHK v1.1.25

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: Задание условия на нажатие клавиши

Спасибо!

Win10x64, AHK v1.1.25

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
Win10x64, AHK v1.1.25

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::

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

Win10x64, AHK v1.1.25