1

Тема: AHK: таймер в скрипте

Здравствуйте. Прошу мне помочь. Имеется очень простая идея : при нажатии и удержании клавиши N определенный интервал времени, должны происходить какие-то следующие действия. Мои попытки вылились вот в это

$vk46::
KeyWait, vk46
If A_TimeSinceThisHotkey>250 ; величина удержания
Send {vk4e}{vk46}
else
Send {vk46}
Return

$vk47::
KeyWait, vk47
If A_TimeSinceThisHotkey>250 ; величина удержания
Send {vk4e}{vk47}
else
Send {vk47}
Return

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

2 (изменено: Grey, 2013-02-28 11:51:24)

Re: AHK: таймер в скрипте

#UseHook

vk46::
   While, GetKeyState(A_ThisHotkey, "P")
   {
      If A_TimeSinceThisHotkey>500
         Send, {vk4e}{vk46}
      Else
         Send, {vk46}
       Sleep, 5
   }
   Return
#MaxHotkeysPerinterval, 1000
#UseHook

vk46::
   While, GetKeyState(A_ThisHotkey, "P")
      Send, % "{"(A_TimeSinceThisHotkey>500 ? "vk4e":"")"}{vk46}"
   Return

3 (изменено: elektrovenik, 2013-02-27 16:26:40)

Re: AHK: таймер в скрипте

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

fffffffffffffffffnfnfnfnfnfnfnfnfnfnfnfnfnfnfnfnfnfnfffff

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

4 (изменено: Irbis, 2013-02-27 17:10:35)

Re: AHK: таймер в скрипте

$vk46::
   loop
   {
      If (A_TimeSinceThisHotkey>250) {
         Send {vk4e}{vk46}
         Break
      }
      if !GetKeyState(SubStr(A_ThisHotkey,2), "P") {
         Send {vk46}
         Break
      }     
   }
   KeyWait, vk46
Return

5 (изменено: elektrovenik, 2013-02-27 18:54:03)

Re: AHK: таймер в скрипте

Интересный скрипт, задумка выполняется. Одно маленькое но - горячая клавиша, без переназначения, исполняется увы долго. Тоесть, это практически "перевернутая" с ног на голову проблема того скрипта, что получился у меня. Там собственная функция горячей клавиши исполнялась мгновенно, а переназначение - после отпускания клавиши, тут же с точностью до наоборот. Можно что-то еще придумать?
P.S Если не сложно расшифруйте суть условия

if !GetKeyState(SubStr(A_ThisHotkey,2), "P")

6 (изменено: Irbis, 2013-02-28 11:59:54)

Re: AHK: таймер в скрипте

Что значит "долго выполняется собственная функция"?
Она сработает в момент отпускания, если время нажатия менее 250мс. А вы хотите, чтоб она сработала в момент нажатия? Увы, в АНК нет такого функционала, как чтение мыслей, чтоб узнать, на какой период времени пользователь нажмет клавишу.  Это становится известно только в момент отпускания клавиши.

По поводу конструкции: в хоткее имеется префикс $, для возможности посыла хоткеем самого себя (можно прочитать в справке).
GetKeyState(A_ThisHotkey) не выдает верного результата из-за префикса, поэтому его отсекаем с помощью SubStr. Надеюсь, так понятно.

Upd   И вообще, в данном случае проще написать  if !GetKeyState("vk46", "P") и не изобретать велосипед

7

Re: AHK: таймер в скрипте

elektrovenik пишет:

...работают к сожалению неверно.

Да, торопился уходить, как результат - не внимательность, извините.

8 (изменено: elektrovenik, 2013-02-28 14:48:06)

Re: AHK: таймер в скрипте

Irbis пишет:

Что значит "долго выполняется собственная функция"?

Вот Ваш скрипт

$vk46::
   loop
   {
      If (A_TimeSinceThisHotkey>250) {
         Send {vk4e}{vk46}
         Break
      }
      if !GetKeyState(SubStr(A_ThisHotkey,2), "P") {
         Send {vk46}
         Break
      }     
   }
   KeyWait, vk46
Return

Запускаем его и пишем слово "папа". Вот что вышло у меня : ппаа. Надеюсь так понятно, что значит "долго"?

Распишу наиболее корректно суть идеи, котору я хочу реализовать, на пальцах :
Я зажал кнопку F на 250мс, скрипт не дожидаясь физического отпускания клавиши, единажды отправляет последовательное нажатие клавиши N и клавиши F. Тоже самое с клавишей G (N и G). Если же я нажимаю эти клавиши как обычно (использую их собственную функию, т.е простую отправку F или G соотвественно), я хочу получить быстрое их исполнение, как при обычном нажатии, без всяких задержек. Это возможно?

9 (изменено: creature.ws, 2013-02-28 18:44:14)

Re: AHK: таймер в скрипте

~vk46::
    KeyWait, vk46, T.25
    if (ErrorLevel) {
        Send {vk4E}{vk46}
        KeyWait vk46
    }
    return

Предвижу дальнейший диалог…

10 (изменено: elektrovenik, 2013-02-28 19:58:45)

Re: AHK: таймер в скрипте

Благодарю тщепетильного creature.ws за помощь )).
Позвольте сказать 2 момента :
1. Я форумулирую желаемую задумку и обращаюсь сюда, к знатокам ahk, за помощью, если сам не додумываюсь как реализовать. Ваш форум предназначен не для этого?
2. Если тем людям, которые отзываются на мои просьбы, пытающимся мне помочь, это не удается с первого раза или вообще, мне промолчать, или солгать сказав "да все супер, спасибо!". Вы скажите, не стесняйтесь, я прислушаюсь к Вашему мнению. Просто это уже второе Ваше сообщение, с негативом в мою сторону. Скажите если я Вам чем-то не угодил, я сделаю выводы.

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

fnf

В любом случае, для игры скрипт годится, т.к. тот скил, что стоит на клавише F, появляется только после нажатия клавиши N, тоесть первое нажатие F просто проходит в пустоту. Если бы условия были несколько иными, как пример с блокнотом, скрипт бы не подошел.
Еще кто-то из знатоков ahk готов поломать голову над задачкой, или она действительно не осуществима в том виде, как я задумал?

11 (изменено: elektrovenik, 2013-02-28 20:01:45)

Re: AHK: таймер в скрипте

Grey пишет:
elektrovenik пишет:

...работают к сожалению неверно.

Да, торопился уходить, как результат - не внимательность, извините.

Как-то сразу не ответил. В этом нет ничего страшного и это не стоит извинений. Я учусь практически на каждом Вашем скрипте, извлекая для себя полезные моменты. И очень рад, что Вы Grey, всегда стараетесь помочь.

12 (изменено: creature.ws, 2013-03-01 00:28:58)

Re: AHK: таймер в скрипте

При нажатии и удержании клавиши F сначала однократно отправляется код клавиши

Это следствие выполнения условия:

Если же я нажимаю эти клавиши как обычно (использую их собственную функию, т.е простую отправку F или G соотвественно)

К сожалению, autohotkey не умеет нарушать принцип причинности, как было сказано,  скрипт не может знать наперёд «как обычно» вы собираетесь нажать клавишу, или «нажать и удерживать».

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

13

Re: AHK: таймер в скрипте

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