1 (изменено: Kamagi, 2012-04-30 12:15:09)

Тема: AHK: Модификатор + одиночной нажатие или двойное нажатие - возможно?

Приветствую!

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

$!h::

If (A_PriorHotKey = A_ThisHotKey && A_TimeSincePriorHotKey <= DClickT)
   MsgBox Bingo
Else
   Send !{h}
Return

2 (изменено: Kamagi, 2012-04-30 20:58:14)

Re: AHK: Модификатор + одиночной нажатие или двойное нажатие - возможно?

Нашел решение здесь:

http://www.autohotkey.com/community/vie … press+with

3

Re: AHK: Модификатор + одиночной нажатие или двойное нажатие - возможно?

По неправильно оформленной ссылке не ходил, но двойное нажатие это примерно так:

DoublePress()
{
    static firstPress
    return firstPress := (A_ThisHotkey == A_PriorHotkey && !firstPress && A_TimeSincePriorHotkey <= 400)
}

$!h::
If DoublePress()
   MsgBox Bingo
Else
   Send !{h}
Return

При «двойном клике» естественно выполнится минимум первый из двух.

4

Re: AHK: Модификатор + одиночной нажатие или двойное нажатие - возможно?

Еще один вариант в копилку
По ссылке весьма продвинутый вариант, в котором нажатий может быть сколько угодно - 1, 2, 3 и т.д. (и всё это с зажатым модификатором)

5

Re: AHK: Модификатор + одиночной нажатие или двойное нажатие - возможно?

!vk48:: ; alt+h
   starttimevk48:=A_TickCount
   KeyWait, vk48
   vk48i++
   SetTimer, % (bool:=A_TickCount-starttimevk48>500)
   ? "actionxxvk48":"countervk48", % "-"(bool ? 0:300)
   Return

countervk48:
   If vk48i=1
      SetTimer, action1vk48, -0
   Else If vk48i=2
      SetTimer, action2vk48, -0
   Else If vk48i=3
      SetTimer, action3vk48, -0
   ; etc.
   vk48i:=
   Return

action1vk48:
   msg("Single")
   Return
action2vk48:
   msg("Double")
   Return
action3vk48:
   msg("Triple")
   Return
actionxxvk48:
   msg("Pressed & released")
   Return

msg(msgtext)
{
   MsgBox,,, % msgtext " click", 1
}

6

Re: AHK: Модификатор + одиночной нажатие или двойное нажатие - возможно?

Есть ещё варианты до кучи:

vk31::
vk32::
vk33::
vk34::
vk35::TrayTip,, % A_ThisHotkey

!vk48::
   KeyWait, vk48
   SetTimer, countervk48, -500
   Return

countervk48:
   If SubStr(A_ThisHotkey, 3)="31"
      msg("First")
   Else If SubStr(A_ThisHotkey, 3)="32"
      msg("Second")
   Else If SubStr(A_ThisHotkey, 3)="33"
      msg("Third")
   Else If SubStr(A_ThisHotkey, 3)="34"
      msg("Fourth")
   Else If SubStr(A_ThisHotkey, 3)="35"
      msg("Fifth")
   ; etc.
   Return

msg(msgtext)
{
   MsgBox,,, % msgtext " action", 1
}
!vk48::
   KeyWait, vk48
   SetTimer, countervk48, -500
   Return

countervk48:
   If A_PriorKey=1
      msg("First")
   Else If A_PriorKey=2
      msg("Second")
   Else If A_PriorKey=3
      msg("Third")
   Else If A_PriorKey=4
      msg("Fourth")
   Else If A_PriorKey=5
      msg("Fifth")
   ; etc.
   Return

msg(msgtext)
{
   MsgBox,,, % msgtext " action", 1
}

7

Re: AHK: Модификатор + одиночной нажатие или двойное нажатие - возможно?

Ого! Круто. Буду тестить. Приведенный мной вариант плох тем, что на него на шару не повесишь несколько хоткеев с одним модификатором. А как он работает я понимаю где-то только на две трети В общем, спасибо!

8

Re: AHK: Модификатор + одиночной нажатие или двойное нажатие - возможно?

"Раз пошла такая пьянка" (С) , вставлю свои  5 копеек. Имхо, каскад из if... else if... не самый красивый вариант.
Вот моя вариация на тему скрипта от Grey:

Keys := {31: "First", 32: "Second", 33: "Third", 34: "Fourth", 35: "Fifth"}
return
vk31::
vk32::
vk33::
vk34::
vk35::TrayTip,, % A_ThisHotkey
 
!vk48::
   KeyWait, vk48
   SetTimer, countervk48, -500
   Return
 
countervk48:
   ch := SubStr(A_ThisHotkey, 3)
   if Keys.HasKey(ch)
      msg(Keys[ch])
   Return
 
msg(msgtext)
{
   MsgBox,,, % msgtext " action", 1
}

9

Re: AHK: Модификатор + одиночной нажатие или двойное нажатие - возможно?

Irbis пишет:

...каскад из if... else if... не самый красивый вариант.

Этому каскаду сто лет в обед, Return во второй строке лишний.

10

Re: AHK: Модификатор + одиночной нажатие или двойное нажатие - возможно?

Насчет Return согласен, по поводу первой части замечания не совсем понял.

11

Re: AHK: Модификатор + одиночной нажатие или двойное нажатие - возможно?

switch() — очень древний

12

Re: AHK: Модификатор + одиночной нажатие или двойное нажатие - возможно?

Раз пошла такая пьянка

Пытаюсь адаптировать код, чтобы он обрабатывал два (и более) хоткеев на одном модификаторе.
Уж больно нравится мне ситуация, когда срабатывание происходит по отжатии модификатора.
Не жалую я всякие SetTimer

Так вот, код:

EnterCnt =

^Enter::
  EnterCnt++                     ; Count Ctrl-Enter's
return

^b::
  EnterCnt++                     ; Count Ctrl-Enter's
return

~CTRL Up::                       ; Ctrl released: Stop counting
  IfEqual EnterCnt,,return       ; Exit if no Ctrl-Enter was pressed yet
  GoSub Action
return


Action:
    if (A_ThisHotKey = ^b)
        {
        Msgbox b
         EnterCnt =  
        Return
        }
  Cnt := EnterCnt
  EnterCnt =                     ; Reset while MsgBox is still active
  MsgBox Number of Ctrl-Enter's is %Cnt%
return

Условие if в action не работает. Пробовал и A_PriorHotKey во всевозможных комбинациях - ноль.
Как правильно задать условие, что есть ^Enter = одно, а если ^b = другое?

13 (изменено: Irbis, 2012-05-02 22:34:56)

Re: AHK: Модификатор + одиночной нажатие или двойное нажатие - возможно?

Разбирайся:

EnterCnt =
^Enter::
  EnterCnt++                     ; Count Ctrl-Enter's
return
^vk42::                            ; "b" или "и"
  EnterCnt++                     ; Count Ctrl-Enter's
return
~CTRL Up::                       ; Ctrl released: Stop counting
  IfEqual EnterCnt,,return       ; Exit if no Ctrl-Enter was pressed yet
  GoSub Action
return

Action:
a := A_PriorHotkey
c := A_ThisHotKey
if (A_PriorHotkey = "^vk42")
        {
        Msgbox % a "      " c
         EnterCnt =  
        Return
        }
  Cnt := EnterCnt
  EnterCnt =                     ; Reset while MsgBox is still active
  MsgBox Number of Ctrl-Enter's is %Cnt%
return

14

Re: AHK: Модификатор + одиночной нажатие или двойное нажатие - возможно?

Я даже не знаю, как выразить мою благодарность.
Это прекрасно! Спасибо!

15

Re: AHK: Модификатор + одиночной нажатие или двойное нажатие - возможно?

You're welcome.

16

Re: AHK: Модификатор + одиночной нажатие или двойное нажатие - возможно?

Irbis пишет:

...по поводу первой части замечания не совсем понял.

Отнюдь, это не замечание, просто хотел сказать, что тот код

creature.ws пишет:

... — очень древний