1

Тема: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

Добрый день, есть приложение(игра) сделал цикл для нажатия клавиш. Но в приложение (игре) эта эмуляция фиксируется и выдается предупреждение, можно ли сделать эмуляцию клавиш как то более реальной. Если нажимать кнопки на клавиатуре предупреждений нет.


vk28::
    vk28 := !vk28
    SetTimer, Loop, -1
    return
loop:
   While vk28
  {
   SendInput {sc22 down}
   sleep 260
   SendInput {sc22 up}
   sleep 10
   SendInput {sc23 down}
   sleep 140
   SendInput {sc23 up}
  }
   
Return

2

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

Измени

vk28::
    vk28 := !vk28
    SetTimer, lLoop, -1
    return
lLoop:
   While vk28
  {
#UseHook, On   
   Send, {sc22 down}
   sleep 260
   Send, {sc22 up}
   sleep 10
   Send, {sc23 down}
   sleep 140
   Send, {sc23 up}
#UseHook, Off
  }
   
Return

и добавь секцию обработки этих клавиш для нажатия на клавиатуре, вот общий результат

#UseHook, On 
vk28::
    vk28 := !vk28
    SetTimer, lLoop, -1
 return
lLoop:
   While vk28
  {
   Send, {sc22 down}
   sleep 260
   Send, {sc22 up}
   sleep 10
   Send, {sc23 down}
   sleep 140
   Send, {sc23 up}
  }
Return

sc22::
   Send, {sc22 down}
   KeyWait, % A_ThisHotkey
   Send, {sc22 up}
Return

sc23::
   Send, {sc23 down}
   KeyWait, % A_ThisHotkey
   Send, {sc23 up}
Return
#UseHook, Off
"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

3

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

Большое спасибо за помощь.

4

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

А помогло? Проверял?
Просто я не уверен, т.к. не знаю что за игра.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

5

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

Пока не знаю надо пробовать 1-2 дня там сервер вроде бы автоматически ищет таково плана программы.

6

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

Так это сетевая игра... думаю твоя клиентская часть отслеживает кликеры... думаю что это проблему будет сложно решить. IMHO

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

7

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

Я в этом разбираюсь плохо но если интересно вот сайт игры http://rus-fishsoft.ru

8

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

Так попробуй:


SetKeyDelay, 10, 150, Play

vk28::
    vk28 := !vk28
    SetTimer, Loop, -1
    return
    
loop:
    While vk28 
        SendPlay {sc22}{sc23} 

но тут будет проблема выхода из цикла.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

Доброе утро, господа программисты. Не хотел создавать новую тему, поскольку имею, примерно, схожую ситуацию. Тоже игра, но уже другая. Это онлайн-игра со своим клиентом (достаточно объемным) и, думаю, не имеет смысла ее называть, поскольку меньше всего хочется, чтобы поисковый запрос по кликеру игры выводил на этот форум.
Итак, имеется комбинация последовательного нажатия клавиш клавиатуры и мыши, срабатывающая по нажатию определенной клавиши.
Например, нажимаю клавишу [a], а игра видит: [q][левая кнопка мыши][w][левая кнопка мыши][q][левая кнопка мыши][e][левая кнопка мыши][q][левая кнопка мыши] и эти нажатия выполняются в минимально возможном интервале времени.
При попытке повторить код выше, не нашел sc для кнопки мыши. И, вообще, насколько наличие мыши повлияет на код?

10 (изменено: Indomito, 2013-10-17 12:05:46)

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

goodbyamerika пишет:

....Итак, имеется комбинация последовательного нажатия клавиш клавиатуры и мыши, срабатывающая по нажатию определенной клавиши.
Например, нажимаю клавишу [a], а игра видит: [q][левая кнопка мыши][w][левая кнопка мыши][q][левая кнопка мыши][e][левая кнопка мыши][q][левая кнопка мыши] и эти нажатия выполняются в минимально возможном интервале времени.
При попытке повторить код выше, не нашел sc для кнопки мыши. И, вообще, насколько наличие мыши повлияет на код?

И  так начну с конца, т.е.  с

И, вообще, насколько наличие мыши повлияет на код?

1. Не очень понял фразу, но думаю, имеется в виду переназначение кликов мышки на что-то иное. Для этого надо скрипт или фрагмент, отвечающий за клики заключить в теги/директивы.

#If WinActive("Имя окна приложения")  
;Код для исполнения
#IfWinActive

Имя окна приложения можно посмотреть в стандартном менеджере задач Windows или же AnVir Task Manager (есть такой бесплатный софт) или же написать скрипт, но второе проще.

2.

...не нашел sc для кнопки мыши.

а зачем он нужен то?
Скан-код т.е. sc нужен для модифицируемых клавиш, например для клавиш NumPad-a, так как он меняют VK-код от состояния клавиши NumLock.

+ Могу предложить VK-коды

VK_LBUTTON 01 Левая кнопка мыши
VK_RBUTTON 02 Правая кнопка мыши
VK_MBUTTON 04 Средняя кнопка мыши
VK_XBUTTON1 05 кнопка мыши X1
VK_XBUTTON2 06 кнопка мыши X2

Всё же проще писать

+ Вот так

LButton - левая кнопка мыши
RButton - правая кнопка мыши
MButton - средняя кнопка мыши (или колесо)
WheelDown - поворот колеса мыши "вниз"
WheelUp - поворот колеса мыши "вверх"
XButton1 - четвертая кнопка мыши, боковая
XButton2 - пятая кнопка мыши, боковая

+ Пример нажатия
F1::
 Send, {LButton Down}
 KeyWait, % A_ThisHotkey
 Send, {LButton Up}
return

3. Теперь приблизительный код в ответ, так как вопрос задан именно так.

+  Почти готовый скрипт
; Скрипт не выгружается
#Persistent
; Запрет повторного запуска
#SingleInstance
vMsgOptionsEr :=0+4096+16 ;only an OK button + System Modal (always on top) + Icon Hand (stop/error)
vMsgOptionsOK :=0+4096+48 ;only an OK button + System Modal (always on top) + Icon Exclamation
;vMsgOptionsDg :=4+4096+32 ;OK/Cancel button + System Modal (always on top) + Icon Question
vMyScript := false
vTitleGame := false
vTitleGameTest := false
return

; Узнаём имя окна игры, проверки пропущены.
LWin & F1::
WinGetActiveTitle, vTitleGame
if (vTitleGame)
      {
        msgbox, % vMsgOptionsOK
                 ,Моя игра
                 ,Имя окна = %vTitleGame%
           ,10
        vTitleGameTest := true
       }
    else 
      {
        msgbox, % vMsgOptionsEr
                 ,Моя игра
                 ,Имя окна не определено или иная ошибка
           ,10
        vTitleGameTest := false    
      }    
return

; Завершение скрипта
lQuit:
LWin & F12::
sleep 1000
gosub lTimerTest
ExitApp


#If (vTitleGameTest && WinActive(vTitleGame))
SetTitleMatchMode, 2

; Активация скрипта по Win+F9, при свёртке- развёртке окна нажать повторно.
LWin & F9::
    Hotkey,  sc1e,                  lSequence,         On ;a
  SetTimer lTimerTest, 50
  vDelay1 := 5 
  vDelay2 := 7
  vDelay3 := 10  
  vMyScript := true
return

; Секция последовательных посылок.
#UseHook, On
lSequence:
;q + LButton 
 Send, {sc10 Down}
  Sleep %vDelay1%
 Send, {sc10 Up}
 gosub lClkMouse
;w + LButton
 Send, {sc11 Down}
  Sleep %vDelay1%
 Send, {sc11 Up}
 gosub lClkMouse 
;q + LButton
 Send, {sc10 Down}
  Sleep %vDelay1%
 Send, {sc10 Up}
 gosub lClkMouse
;e + LButton
 Send, {sc12 Down}
  Sleep %vDelay1%
 Send, {sc12 Up}
 gosub lClkMouse
;q + LButton
 Send, {sc10 Down}
  Sleep %vDelay1%
 Send, {sc10 Up}
 gosub lClkMouse
return

lClkMouse:
 Sleep %vDelay3%
  Send, {LButton  Down}
 Sleep %vDelay2%
  Send, {LButton  Up}
 Sleep %vDelay3%
return 

#UseHook, Off

lTimerTest:
 if !((WinActive(vTitleGame) && vMyScript && vTitleGameTest))
       {
          Hotkey,  sc1e,                  lSequence,         Off
          SetTimer lTimerTest, off
          vMyScript := false
       }
return
#IfWinActive

Вроде надо так, но я скрипт не проверял, так что возможны ошибки.. всякое бывает

P.S. Да, забыл - задержки придётся подобрать "методом научного тыка" - всё зависит от игры.

+ открыть спойлер
  vDelay1 := 5 
  vDelay2 := 7
  vDelay3 := 10
"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

11 (изменено: Indomito, 2013-10-17 09:12:20)

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

И кстати, если что-то нужно написать, скажем, при нажатии на стрелку вправо, то пишем так.

Hotkey, Right, lRight,  On
return

#UseHook, On
lRight:
  Send, {Right Down}
  while (GetKeyState("Right", "P"))
     {
        if (GetKeyState("LButton", "P"))
          {   ; Действия при зажатой стрелке вправо и клике левой кнопкой мыши
             Send, {LButton Up} ; Обязательно иначе не будет клика ЛКМ
          }
     }  
  Send, {Right Up}
return
#UseHook, Off
"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

12 (изменено: goodbyamerika, 2013-10-17 10:33:33)

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

Бывают же такие Люди! Огромное спасибо, Indomito!
К сожалению, возможности проверить коды в действии пока нет, но как появится - отпишусь.

Такой еще вопрос: могу я воспользоваться функцией генерации случайного числа Random, обозначив границы в пределах 3..10 (или 10-30) и рассчитывать таким образом vDelay1, vDelay2, vDelay3 между каждым обращением к клавише запускающей последовательность?

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

П.С.: занимаюсь достаточно давно цифровой обработкой сигналов (наукой и реализацией), если можно будет чем помочь, то обязательно помогу. :-)

13

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

goodbyamerika пишет:

Бывают же такие Люди! Огромное спасибо, Indomito!

не за что сам писал нечто подобное, но с таймерами - просто машина в игре ехала не равномерно

Такой еще вопрос: могу я воспользоваться функцией генерации случайного числа Random, обозначив границы в пределах 3..10 (или 10-30) и рассчитывать таким образом vDelay1, vDelay2, vDelay3 между каждым обращением к клавише запускающей последовательность?

можно, а нужно?
Надо просто посмотреть работу скрипта в действии и сравнить, реально или же нет, он работает, если нет, то подобрать задержки более близкие к обычным нажатиям - и всё.

Удачи.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

14 (изменено: afik08, 2013-10-17 11:11:32)

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

Спасибо вроде бы пока всё работает)))

15 (изменено: Indomito, 2013-10-17 11:18:01)

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

afik08 удалил

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

16

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

это я не суда случайно))))

17

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

goodbyamerika нашёл опечатку, т.е. ошибку, пока писал скрипт.

+ Было
; Завершение скрипта
lQuit:
LWin & F12::
sleep 1000
gosub lTimerTest
ExitApp
return ; этот return не обязателен

#If (vTitleGameTest && WinActive(TitleMyGame))
SetTitleMatchMode, 2
+ Надо
; Завершение скрипта
lQuit:
LWin & F12::
sleep 1000
gosub lTimerTest
ExitApp ; Убрал return


#If (vTitleGameTest && WinActive(vTitleGame)) ;Была TitleMyGame, а надо vTitleGame
SetTitleMatchMode, 2

Пишу, так как я думаю, что сам не сразу найдёшь.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

18

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

Еще такой вопрос как в это цикл правильно поставить команду PixelGetColor, что бы при нажатии на vk28 цикл начинался затем нажималась клавиша sc23 и была нажата пока не будет найден нужный пиксель, после этого она отпускалась и происходило то же действие со следующей кнопкой. Завершение цикла в любой момент при нажатии на vk28.


vk28::
    vk28 := !vk28
    SetTimer, lLoop, -1
    return
    
sc22::
   Send, {sc22 down}
   KeyWait, % A_ThisHotkey
   Send, {sc22 up}
Return

sc23::
   Send, {sc23 down}
   KeyWait, % A_ThisHotkey
   Send, {sc23 up}
Return

lLoop:
   While vk28
  {
   #UseHook, On  
   Send, {sc23 down}
   PixelGetColor, Color, 946, 591, fast
   if (Color = 0x3c8c5c)
   Send, {sc23 up}
   sleep 10
   Send, {sc22 down}
   PixelGetColor, Color, 946, 606, fast 
   if (Color = 0x3c8c5c)
   Send, {sc22 up}
   #UseHook, Off
  }
   
Return

19 (изменено: goodbyamerika, 2013-10-17 16:45:47)

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

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

LWin & F9::
    Hotkey,  sc1e,                  lSequence,         On ;a
  SetTimer lTimerTest, 50

вставить еще одно условие, допустим для клавиши sc22:

Hotkey,  sc22,                  lSequence2,         On ;

Потом уже в секции последовательных посылок вставить еще одно lSequence2 со своей комбинацией:

#UseHook, On
lSequence:
;q + LButton 
 Send, {sc10 Down}
  Sleep %vDelay1%
 Send, {sc10 Up}
 gosub lClkMouse
 ...
lSequence2:
;w + LButton 
 Send, {sc11 Down}
  Sleep %vDelay1%
 Send, {sc11 Up}
 gosub lClkMouse

Ну, и чуть ниже в

lTimerTest:
 if !((WinActive(vTitleGame) && vMyScript && vTitleGameTest))
       {
          Hotkey,  sc1e,                  lSequence,         Off
          SetTimer lTimerTest, off
          vMyScript := false

добавить Hotkey,  sc1e, lSequence2, Off.
Ведь lSequence это всего лишь переменная?

20 (изменено: goodbyamerika, 2013-10-17 16:40:14)

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

Проверил свое предположение в текстовом редакторе - вроде работают обе клавиши. Посмотрю вечером, как игра отреагирует на это все.

21 (изменено: Indomito, 2013-10-17 17:02:07)

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

goodbyamerika пишет:

Проверил свое предположение в текстовом редакторе - вроде работают обе клавиши. Посмотрю вечером, как игра отреагирует на это все.

работать должно, если я где то не опечатался

добавить Hotkey,  sc1e, lSequence2, Off.
Ведь lSequence это всего лишь переменная?

lSequence не переменная, а метка,  разница в том, что при команде Hotkey метка должна быть, а переменная не обязательно, так как переменные объявляются динамически, т.е. их можно не объявлять заранее при a := b  переменной b может и не существовать и эквивалентом  a := b будет а := 0 или  а := "" и тд.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

22

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

Вчера располагал крайне малым запасом времени для проверки скрипта, но тем не менее его удалось запустить и все работало как надо, спасибо Indomito. Но возникла одна неприятная штучка: неудобно использовать такую клавишу.

Как заставить скрипт использовать бинд не по одной клавише, а так:

Сначала он ждет когда нажмут клавишу (допустим ф), и только в случае если следующая клавиша будет левая кнопка мыши, тогда он срабатывает.

23 (изменено: Indomito, 2013-10-19 00:35:24)

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

goodbyamerika пишет:

Вчера располагал крайне малым запасом времени для проверки скрипта, но тем не менее его удалось запустить и все работало как надо, спасибо Indomito.

не зачто - обращайся её, правда я не очень часто посещаю этот форум(у меня возник вопрос и я получил ответ, а когда я его получил увидел твой вопрос и ответил)

Но возникла одна неприятная штучка: неудобно использовать такую клавишу.
Как заставить скрипт использовать бинд не по одной клавише, а так:
Сначала он ждет когда нажмут клавишу (допустим ф), и только в случае если следующая клавиша будет левая кнопка мыши, тогда он срабатывает.

+ Приблизительно так, извини что такой большой код, но так будет проще
subStart:
 fLCtrl := false
 cSleep := 25
 gosub lXon
return

subEnd:
  gosub lXoff 
return

lXon:
    Hotkey, LCtrl, subLCtrl, On
return
  
lXoff:
    Hotkey, LCtrl, subLCtrl, Off
return

#UseHook, On
  
subLCtrl:
  while (GetKeyState("LCtrl", "P"))
    {
      vKey := "LCtrl"
      if (GetKeyState("F1", "P"))
        { 
         if (fLCtrl)
             {
              fLCtrl := false ; Выключить обработку
              Break  ; при следующем нажатии, пока выдаём "Ctrl"
             }  
            else
             {
              fLCtrl := true ; Включить обработку
              Break ; при следующем нажатии, пока выдаём "Ctrl"
             }
          }   
       if (GetKeyState("F2", "P") && fLCtrl)
             {
              vKey := "F10" ;При условии зажатого Ctrl и нажатого и отжатого F2 +  флаг fLCtrl=true
              Break ;выдача "F10"
             }
            else
              Break ; выдаём "Ctrl"
        }
    }
  Send, {%vKey% Down}
   sleep %cSleep%
  Send, {%vKey% Up}
return
#UseHook, Off

Не сделал обращение к подпрограмме subEnd - оставил реализацию для тебя.

Надеюсь, что не очень сложно и учти  - я код не проверял.
Да, ещё, определение клавиш "LCtrl", "F1", "F2" и "F10" можно сделать через переменные/константы.

У меня в одном скрипте было написано так - HotKey %bfHotK%,%vLabel%, %cOnHK% UseErrorLevel  ; Включение HotKey 
Я не стал тут так писать, что бы тебя не запутать

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

24

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

Сначала он ждет когда нажмут клавишу (допустим ф), и только в случае если следующая клавиша будет левая кнопка мыши, тогда он срабатывает.


#InstallKeybdHook
  
#IF (A_PriorKey = "F")
LButton:: ToolTip % A_PriorKey
#IF
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

25 (изменено: Indomito, 2013-10-21 15:06:06)

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

Это кажется не удержание, а одновременное нажатие.
Проще написать

Hotkey, LCtrl & F, lCtrlF, On
return

lCtrlF:
 ToolTip  Нажали LCtrl + F
return

Так хоть можно отключить обработку Hotkey

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

26

Re: АНК: Эмуляция нажатия клавиш фиксируется приложением(Игрой)

Супер! Спасибо, Indomito. Проверю код сегодня вечером, но, думаю, там все ок.

не за что - обращайся её, правда я не очень часто посещаю этот форум(у меня возник вопрос и я получил ответ, а когда я его получил увидел твой вопрос и ответил)

Ты ответил даже быстрее, чем я вспомнил про свой пост .

Была лишняя скобочка в 47-48 строке.