1

Тема: AHK: Спам кнопок, отмена Loop с переходом на следующий

Собственно, написал я скрипт для всех спама всех кнопок по типу:

2::
Loop 50
{
Send 6
sleep 1
}
return
3::
Loop 50
{
Send 6
Sleep 1
}
return

Проблема в том, что при одновременном нажатии {2}{3} результат выглядит следующим образом: (2x3)(3x50)(2x47). Т.е. предыдущий Loop заканчивается после данного. Решение Critical thread не подходит, прошу помочь.

2

Re: AHK: Спам кнопок, отмена Loop с переходом на следующий

А почему Critical не подходит?

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

3 (изменено: Idopwn, 2011-10-23 02:22:22)

Re: AHK: Спам кнопок, отмена Loop с переходом на следующий

Не подходит, в силу того, что временами нужно резко переходить от спама одной кнопки к другой, причем каждая доля секунды на счету. Возможно ли это решить приоритетами?

1. Реально ли сделать вверху %кнопки_хоткеев%::Break, дабы любая кнопка сначала снимала текущий луп, а затем начинала свой? (просто идеальное решение для моей проблемы является именно отменой-началом лупов).
2. Почему-то перестали распозноваться хоткеи по типу +{q}::, ранее именно так распознавались (дело было давно, быть может, забыл что-то).
3. Чему равен Sleep 0(1?) в реальных мс (для правильного расчета лупов)?
4. Верно ли, что данный скрипт спамит максимально часто кнопку при удержании? (как альтернативный вариант, первый всё же намного лучше)

$2::
   Loop  
   {
    if not GetKeyState("2", "P")
      break
     Send 2 
     sleep 1
    }
return

Прошу прощения за стену текста, тега спойлера не нашел.

З.Ы.: Благодарю teadrinker за посыл на форум.

4

Re: AHK: Спам кнопок, отмена Loop с переходом на следующий

Idopwn пишет:

...любая кнопка сначала снимала текущий луп, а затем начинала свой...

Не обязательно использовать команду Loop, чтобы послать 50 нажатий:

$vk31::
   SetTimer, StopSendKey2, -0
   SetTimer, StopSendKey3, -0
   SetTimer, SendKey1, 1
   KeyWait, vk31
   Return
SendKey1:
   Counter1++
   If Counter1=50
      SetTimer, StopSendKey1, -0
;   Send, {vk31}
   TrayTip,, % "send key 1: "Counter1
   Return
StopSendKey1:
   SetTimer, SendKey1, Off
   Counter1:=
   Return

$vk32::
   SetTimer, StopSendKey1, -0
   SetTimer, StopSendKey3, -0
   SetTimer, SendKey2, 1
   KeyWait, vk32
   Return
SendKey2:
   Counter2++
   If Counter2=50
      SetTimer, StopSendKey2, -0
;   Send, {vk32}
   TrayTip,, % "send key 2: "Counter2
   Return
StopSendKey2:
   SetTimer, SendKey2, Off
   Counter2:=
   Return

$vk33::
   SetTimer, StopSendKey1, -0
   SetTimer, StopSendKey2, -0
   SetTimer, SendKey3, 1
   KeyWait, vk33
   Return
SendKey3:
   Counter3++
   If Counter3=50
      SetTimer, StopSendKey3, -0
;   Send, {vk33}
   TrayTip,, % "send key 3: "Counter3
   Return
StopSendKey3:
   SetTimer, SendKey3, Off
   Counter3:=
   Return
Idopwn пишет:

...перестали распозноваться хоткеи по типу +{q}::...

Используйте виртуальный/клавиатурный коды.

Idopwn пишет:

Чему равен Sleep 0(1?)...

Есть описание в документации по этой команде.

5

Re: AHK: Спам кнопок, отмена Loop с переходом на следующий

Извинюясь, но совсем не понял сути написанного вами скрипта, хоть и увидел трейтип с каунтером, это мне ничуть не помогло, возможно ли по этому же типу вместо накрутки цифр каунтера сделать спам кнопок? В смысле переключение в таком же стиле, уже вторую неделю бьюсь над скриптом, ничего не помогает, даже GetKeyState удерживанием не подходит, в силу своих лагов...

6 (изменено: Grey, 2011-10-24 05:39:31)

Re: AHK: Спам кнопок, отмена Loop с переходом на следующий

По сути это пример из трёх клавиш, нажатие на любую из них запускает собственный таймер и прекращает работу другого таймера запущенного ранее (если такая ситуация имеет место), разкомментируйте строки вида: Send, {vk..., и удалите строки с TrayTip (эти строки для нагдядности действий).

7 (изменено: Idopwn, 2011-10-24 13:11:30)

Re: AHK: Спам кнопок, отмена Loop с переходом на следующий

Всё работает идеально, в точности как надо! Но как быть, если требуются скрипты для более 20-и посылов? Как можно разрешить такую задачку, не размножая первые три строки (stopsendxtimer и sendztimer)?

8 (изменено: Grey, 2011-10-26 10:06:10)

Re: AHK: Спам кнопок, отмена Loop с переходом на следующий

$vk31::
$vk32::
$vk33::
$vk34::
$vk35::
$vk36::
$vk37::
$vk38::
$vk39::
$vk30::
   Counter:=
   SetTimer, SendKey, 1
   KeyWait, % A_ThisHotkey
   Return

SendKey:
   Counter++
   If Counter=50
   {
      SetTimer, SendKey, Off
      Counter:=
   }
   Send, % "{"SubStr(A_ThisHotkey, 2)"}"
   Return

Можно ещё так, разницы нет:

#UseHook
vk31::
vk32::
vk33::
vk34::
vk35::
vk36::
vk37::
vk38::
vk39::
vk30::
   Counter:=
   SetTimer, SendKey, 1
   KeyWait, % A_ThisHotkey
   Return

SendKey:
   Counter++
   If Counter=50
   {
      SetTimer, SendKey, Off
      Counter:=
   }
   Send, % "{"A_ThisHotkey "}"
   Return

, еще пара вариантов:

#UseHook
vk31::
vk32::
vk33::
vk34::
vk35::
vk36::
vk37::
vk38::
vk39::
vk30::
   Counter:=
   Start ? Stop:=1:Stop:=0
   Start:=1
   While Counter<50
   {
      If Stop
         Break
      Counter++
      Send, % "{"A_ThisHotkey "}"
      Sleep, -1
   }
   Stop:=Start:=0, Counter:=
   KeyWait, % A_ThisHotkey
   Return
#UseHook
vk31::
vk32::
vk33::
vk34::
vk35::
vk36::
vk37::
vk38::
vk39::
vk30::
   Counter:=
   Stop:=Start ? 1:0
   Start:=1
   Loop
   {
      If Stop
      Or Counter=50
         Break
      Counter++
      Send, % "{"A_ThisHotkey "}"
      Sleep, -1
   }
   Stop:=Start:=0, Counter:=
   KeyWait, % A_ThisHotkey
   Return

Хотя таймер явно проигрывает циклу в скорости:

SetFormat, Float, 0.3
$vk31::
   Start:=A_TickCount
   Counter:=
   SetTimer, SendKey, 1
   KeyWait, vk31
   Return
SendKey:
   Counter++
   If Counter=50
   {
      TrayTip,, % (A_TickCount-Start)/1000 " sec."
      SetTimer, SendKey, Off
      Start:=Counter:=
   }
   Send, {vk31}
   Return

$vk32::
   StartCount:=A_TickCount
   Counter:=
   Stop:=Start ? 1:0
   Start:=1
   Loop
   {
      If Stop
      Or Counter=50
         Break
      Counter++
      Send, {vk32}
      Sleep, -1
   }
   TrayTip,, % (A_TickCount-StartCount)/1000 " sec."
   Stop:=Start:=0, StartCount:=Counter:=
   KeyWait, vk32
   Return

, всё же он более стабильнее.

9

Re: AHK: Спам кнопок, отмена Loop с переходом на следующий

Благодарю за столь огромную проделанную работу О_о
Как быть с посылами по типу ctrl+q, shift+e и т.д.? Попытаюсь воспользоваться скриптом вылова кодов клавиатуры.
Наиболее оптимален - первый вариант скрипта?

10 (изменено: Grey, 2011-10-27 19:43:15)

Re: AHK: Спам кнопок, отмена Loop с переходом на следующий

Idopwn пишет:

Как быть с посылами по типу ctrl+q, shift+e и т.д.?

#UseHook
*vk31::
*vk32::
*vk33::
*vk34::
*vk35::
*vk36::
*vk37::
*vk38::
*vk39::
*vk30::
*vk51:: ; q
*vk57:: ; w
*vk45:: ; e
*vk52:: ; r
*vk54:: ; t
; и т.д.
   If !MKeyPressed
      UseShifts:=UseControls:=UseAlts:=0
   Counter:=0
   SetTimer, SendKey, 1
   KeyWait, % A_ThisHotkey
   Return
SendKey:
   Counter++
   If Counter=50
   {
      SetTimer, SendKey, Off
      Counter:=0
      If UseShifts
      Or UseControls
      Or UseAlts
         Goto, SendLastMKey
   }
   IfEqual, UseShifts, 1
    , Send, % "+{"SubStr(A_ThisHotkey, 2)"}"
   Else IfEqual, UseControls, 1
    , Send, % "^{"SubStr(A_ThisHotkey, 2)"}"
   Else IfEqual, UseAlts, 1
    , Send, % "!{"SubStr(A_ThisHotkey, 2)"}"
   Else
      Send, % "{" SubStr(A_ThisHotkey, 2)"}"
   Return
SendLastMKey:
   IfEqual, UseShifts, 1
    , Send, % "+{"SubStr(A_ThisHotkey, 2)"}"
   Else IfEqual, UseControls, 1
    , Send, % "^{"SubStr(A_ThisHotkey, 2)"}"
   Else IfEqual, UseAlts, 1
    , Send, % "!{"SubStr(A_ThisHotkey, 2)"}"
   UseShifts:=UseControls:=UseAlts:=0
   Return

vkA0:: ; shifts
vkA1::
   MKeyPressed:=UseShifts:=1
   Send, % "{"A_ThisHotkey " Down}"
   KeyWait, % A_ThisHotkey
   Send, % "{"A_ThisHotkey " Up}"
   MKeyPressed:=0
   Return

vkA2:: ; ctrls
vkA3::
   MKeyPressed:=UseControls:=1
   Send, % "{"A_ThisHotkey " Down}"
   KeyWait, % A_ThisHotkey
   Send, % "{"A_ThisHotkey " Up}"
   MKeyPressed:=0
   Return

vkA4:: ; alts
vkA5::
   MKeyPressed:=UseAlts:=1
   Send, % "{"A_ThisHotkey " Down}"
   KeyWait, % A_ThisHotkey
   Send, % "{"A_ThisHotkey " Up}"
   MKeyPressed:=0
   Return
Idopwn пишет:

Наиболее оптимален - первый вариант скрипта?

Любой с таймером.