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

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

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

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

Win10x64, AHK v1.1.25

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.

Win10x64, AHK v1.1.25

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

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

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), отправвляется различное число комманд (вначале первое значение переменной, затем последующее).

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

Win10x64, AHK v1.1.25

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

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

Win10x64, AHK v1.1.25

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"]
}

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

Win10x64, AHK v1.1.25

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

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

Win10x64, AHK v1.1.25

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

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

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.: Здесь реализована возможность добавления действия на зажатие клавиши?

Win10x64, AHK v1.1.25

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

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

Win10x64, AHK v1.1.25

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, к сожалению, команды отправляются в цикле.

Win10x64, AHK v1.1.25

75

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

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