1 (изменено: Grey, 2011-06-01 01:43:18)

Тема: АНК: Действие по нажатию

Доброго времени суток всем, возникла интересная ситуация: в коде ниже присутствие хоткея на сочетание клавиш E & W не дают выполнить действие по нажатию на клавишу E (в окне АНК это классифицируется как s=Suppressed (blocked)). Получается только действие по отжатию, хотя охормелено-таки на оборот. Так вот, как обойти сей казус?, при учёте, что в коде нужно наличие всех хоткеев? Спасибо.

vk45 & vk57:: ; e & w
   ToolTip, действие по нажатию клавиши E & W далее переход
   Sleep, 750
   ToolTip
   GoSub, Label

vk57:: ; w
Label:
   ToolTip, действие по нажатию клавиши W
   Sleep, 750
   ToolTip
   KeyWait, vk57
   Return

vk45:: ; e
   ToolTip, действие по нажатию клавиши E
   Sleep, 750
   ToolTip
   KeyWait, vk45
   Return

2

Re: АНК: Действие по нажатию

Предположим, ты нажал "е". Что программа должна делать, выполнять действия по нажатию "е", или ждать, а не нажмёшь ли ты ещё и "w", и если ждать, то сколько?

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

3

Re: АНК: Действие по нажатию

Я правда как-то не обдумывал этот вариант с ожиданием. Программа должна выполнить действие по нажатию E, ну и если можно ждать некоторое время (совсем не много к примеру 50мс) возможного нажатия W. Собственно, само сочетание E & W, оно для того, чтобы при быстром почти одновременном нажатии на E и потом на W, хоткей W не блокировал дальнейшие нажатия на клавишу E. А так и выходит, если в коде не будет сочетания E & W.

4

Re: АНК: Действие по нажатию

Вот так при нажатии на "w" сразу выполняется соответствующая подпрограмма, а при нажатии на "e" 50 mc ожидается нажатие "w":

vk45::  ; e
   if GetKeyState("vk57", "P")
      Return
   Else
   {
      KeyWait, vk57, D T0.05
      if ErrorLevel
         Gosub, ActionE
      Else
         Gosub, ActionEW
   }
   Return
   
vk57::  ; w
   if GetKeyState("vk45", "P")
      Return
   Else
      Gosub, ActionW
   Return
   
ActionE:
   MsgBox, E
   Return
   
ActionW:
   MsgBox, W
   Return
   
ActionEW:
   MsgBox, EW
   Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: Grey, 2011-06-01 07:15:58)

Re: АНК: Действие по нажатию

Видимо я не до конца выразил конечную цель, в Вашем варианте после нажатия/отжима Е, и последующем нажатии/удержании W, становится неактивна Е, так же при простом нажатии/удержании W блокируется Е. Нужно, чтобы при нажатии/удержании W, или после нажатия/отжима Е, и последующем нажатии/держании W - клавиша Е была активна. Этот код (с While-loop), вроде работает.

vk45::  ; e
   If GetKeyState("vk57", "P")
      Return
   Else
   {
      KeyWait, vk57, D T0.05
      If ErrorLevel
         Gosub, ActionE
   }
   Return
   
vk57::  ; w
   If GetKeyState("vk45", "P")
      Return
   Else
      Gosub, ActionW
   Return
   
ActionE:
;   MsgBox,,,E, 1
   ToolTip, pressed E button
   Sleep, 750
   ToolTip
   While GetKeyState("vk45", "P")
      {
         Sleep, 30
         If GetKeyState("vk57", "P")
         Gosub, ActionW
      }
   Return
   
ActionW:
;   MsgBox,,,W, 1
   ToolTip, pressed W button
   Sleep, 750
   ToolTip
   While GetKeyState("vk57", "P")
      {
         Sleep, 30
         If GetKeyState("vk45", "P")
         Gosub, ActionE
      }
   Return

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

6

Re: АНК: Действие по нажатию

Grey пишет:

Нужно, чтобы при нажатии/удержании W, или после нажатия/отжима Е, и последующем нажатии/держании W - клавиша Е была активна.

А какая подпрограмма должна выполняться, если нажато "E" при удерживаемом "W", "ActionE" или "ActionEW"?

Grey пишет:

Этот код (с While-loop), вроде работает.

У меня при нажатии "EW" ничего не происходит. Так и нужно?

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

7

Re: АНК: Действие по нажатию

teadrinker пишет:

А какая подпрограмма должна выполняться... ?

"ActionE"

teadrinker пишет:

У меня при нажатии "EW" ничего не происходит. Так и нужно?

Да, сочетание E & W, из первого кода, где я этим сочетанием пытался препятствовать блокировке клавиши Е, при отжиме её и быстром нажатии/одновременном нажатии и удержании клавиши W.

Чуть откорректировал код приведённый мною выше:

vk45:: ; e
ActionE:
   ToolTip, pressed E button
   Sleep, 250
   ToolTip
   While GetKeyState("vk45", "P")
      {
         Sleep, 30
         If GetKeyState("vk57", "P")
            Gosub, ActionW
      }
   Return

vk57:: ; w
ActionW:
   ToolTip, pressed W button
   Sleep, 250
   ToolTip
   While GetKeyState("vk57", "P")
      {
         Sleep, 30
         If GetKeyState("vk45", "P")
            Gosub, ActionE
      }
   Return

Я извиняюсь, но всё же повторюсь: при нажатии Е, должно выполниться действие этого хоткея, а при отжиме его и быстром нажатии, или ситуации когда он (хоткей клавиши Е) ещё не отжат, а уже нажата клавиша W, не должно произойти блокирование Е удерживаемой клавишей W. Если есть вариант, хотел бы узнать как сие сделать без использования While-loop?

8

Re: АНК: Действие по нажатию

Честно говоря, не понял логики вышеприведённого кода.

Grey пишет:

или ситуации когда он (хоткей клавиши Е) ещё не отжат, а уже нажата клавиша W, не должно произойти блокирование Е удерживаемой клавишей W.

Чтобы подпрограмма горячей клавиши не перебивалась при нажатии других горячих клавиш, используется команда Critical. Если написать её первой строкой в подпрограмме горячей клавиши, нажатия других горячих клавиш не будут её перебивать, а будут буферизироваться, и выполнятся после её завершения.

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

9

Re: АНК: Действие по нажатию

Ясно, спасибо.