1

Тема: Скрипт для разных игр

По сути это готовый скрипт для игр в которые я играл, может быть его фрагменты помогут кому либо, для чего либо

+ Описательный модуль(он в другом скрипте)
;==========Общие пути===========
fnPathUses()
{
global  ;--Общесистемные пути

ProgSysPath32 := "C:\Program Files (x86)\"
ProgSysPath64 := "C:\Program Files\"
WindowsDir := "C:\Windows\"

;--Пути к AHK
PathAhkProg := ProgSysPath32 "AutoHotkey\"
PathAhk := "C:\AHK\"
PathAhkInclude := PathAhk "Include\"
PathAhkIcon := PathAhk "Icon\"

;--Escape-последовательности как константы для MsgBox, %
cEscCR    := "`r"
cEscLF    := "`n"
cEscTab   := "`t"
cEscSps   := " "
cEscPrc      := "`%"
cEscQts   := """"

cAscCR    := Asc(cEscCR)
cAscLF    := Asc(cEscLF)
cAscTab   := Asc(cEscTab)
cAscSps   := Asc(cEscSps)
cAscPrc      := Asc(cEscPrc)
cAscQts   := Asc(cEscQts)

cEsc2LF    := cEscLF cEscLF
cEscCRLF  := cEscCR cEscLF

return
}

fnOverallSection(){
global ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;===========Переменные,константы и некотрые функции для скрипта===================
;cName       - константа
;iName       - константа индекс в массиве
;vNane       - переменная
;fnName      - функция
;fName       - флаг
;arName      - массив
;+++++++++++++++++Константы функций вывода окна MsgBox+++++++++++++++++++++++++++++++++++++++++
 сMsgOptionsEr   :=0+8192+16 ;only an OK button + Task Modal + Icon Hand (stop/error)
 сMsgOptionsOK   :=0+8192+48 ;only an OK button + Task Modal + Icon Exclamation
 сMsgOptionsDg   :=4+8192+32 ;Yes/No button  + Task Modal + Icon Question
 сMsgOptionsInfo :=4+8192+64 ;Yes/No button + Task Modal +  Icon Asterisk (info)
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
;+++++++++++++++++Пути к McAfee и некоторые переменные+++++++++++++++++++++++
mcPath := ProgSysPath32 "McAfee\"
mcVSE  := mcPath "VirusScan Enterprise\"
mcCFW  := mcPath "Common Framework\"
mcWinNameConsol := "Консоль VirusScan"
mcConsol := "mcconsol.exe"
mcKey1 := "/NOSPLAS" 
;++++++++++++++++++++++++++++++++++++++++++

;+++++++++++++++++Переменные и константы для вызова консоли в контексте NetSh+++++++
cConsole     := "cmd.exe"
cNameNet     := "Internet"
cNetsh       := "netsh interface ipv4 set address" cEscSps cEscQts cNameNet cEscQts cEscSps
cNetON       := cNetsh "dhcp"
cNetOFF      := cNetsh "static 1.0.0.0"
vNetOnOffHlp := "ON" 
vInternetPID := false
arOut:=arInternet:=Object()
NetName :=1, NetDHCP :=2, NetIP :=3, NetGate :=4, NetState:=5, NetST:=1, FindKey :=2
Internet := [["","интерфейса" cNameNet], ["" ,"включен:"], ["" ,"IP-адрес"], ["" ,"шлюз:"], [false,false]]
;+++++++++++++++++


;++++++++++++++Для Skyrim
vDubKeys := 1
;++++

vGameKey := true ; On/Off игровых клавиш (при запуске ON)
fHelpKey := false ; для блокировки повторного запуска справки
fScVkCode := false ; Получение Sc/Vk-Code отключено.
fEventManager:=true ; блокиратор менеджера
;++++

;++++++++++++++Для Saints Row: The Third
fNumLock := false
vNumLock := false
fLockRShift := false 
vDebugTHQ := false ;(true/false)  ;If debugging is enabled, then output your data to control the correct operation (scope of - all script).
gosub lVarGameTHQ
;++++++++++++++

;++++++++++++++Для The Witcher 2 - Assassins of Kings Enhanced Edition
fWitcher:=false
;++++++++++++++

return
}
+ Модуль игр (убрана игра Saints Row The Third - я её описал в другом топике)
;***************BEGIN******************
GameKeyOnOff:
if (!vGameKey)
  {
  msgbox 1,Switching Game Keys,Игровые клавиши = OFF `n `nВКЛючить игровые клавиши? ,10
  IfMsgBox, Cancel
      return
    else
      vGameKey := true    
  }
 else
  {
  msgbox 1,Switching Game Keys,Игровые клавиши = ON `n `nВЫКЛючить игровые клавиши?,10
  IfMsgBox, Cancel
      return
    else
      vGameKey := false      
  } 
return

;------------------------- Подпрограмма счётчика нажатий
/*
;----- Пример для левой кнопки мыши ----
#UseHook, On

LButton:: Gosub, PressCount

LButton(1):                        ; Одиночный действует как и раньше (почти,
  Click Down Left                 ; т.к. пауза иногда даёт о себе знать при 
  KeyWait, LButton                 ; перетаскивании правой кнопкой).
  Click Up Left
Return

LButton(2):
  ToolTip, Двойной правый щелчок.
  Sleep, 1000
  ToolTip
Return

#UseHook, Off
;-----------------------------------------
*/

PressCount:
  Pause_= 300     ; Если пауза меньше этого количества миллисекунд, то нажатие
                 ; двойное. Если больше, то оно расценивается как 2 одиночных.
  If not Second
  {
    Second=1
    SetTimer, DoublePress, -%Pause_%
  }
  Else
  {
    Second=0
    SetTimer, %A_ThisHotkey%(2), -1
  }
Return

DoublePress:
  If not Second
    Return
  Second=0
  SetTimer, %A_ThisHotkey%(1), -1
Return

/*
;-----BEGIN--Для The Witcher 2
#If vGameKey && WinActive("The Witcher 2") 
SetTitleMatchMode, 2
Tab::
   Send, {m Down}
   sleep 25
   Send, {m Down}
   sleep 25
   Send, {m Up}   
return
#IfWinActive
;-----END--Для The Witcher 2
*/

;-----BEGIN--Для SIMS 3 
#If vGameKey && WinActive("The Sims™ 3")
SetTitleMatchMode, 2

LShift & ESC::
Send {F5}
return

RShift & Enter::
Tab::
Send {n}
Enter::
MouseClick, right, 20, 910
MouseMove, 620, 475
Sleep, 700
MouseClick, WheelUp, , , 6
return

#IfWinActive
;-----END--Для SIMS 3

;-----BEGIN--Для Risen 2 - Dark Waters
#If vGameKey && WinActive("Risen")
SetTitleMatchMode, 2
Enter::
 Send {8}
return

RShift::
 Send {9}
return

RCtrl::
 Send {0}
return

Numpad1::
 Send {1}
return
Numpad2::
 Send {2}
return
Numpad4::
 Send {4}
return
Numpad5::
 Send {5}
return
Numpad6::
 Send {6}
return
Numpad7::
 Send {7}
return
Numpad3::
 Send {3}
return

#IfWinActive     
;-----END--Для Risen 2 - Dark Waters 

;-----BEGIN--Для Dragon Age 
#If vGameKey && WinActive("Dragon Age: Начало")
SetTitleMatchMode, 2
RShift::
vk2D::
Numpad0::
   Send, {Up Down}{Enter Down}
;{RButton Down}
   KeyWait, % A_ThisHotkey
   Send, {Up Up}{Enter Up}
;{RButton Up}
Return

#IfWinActive
;-----END Для Dragon Age

;-----BEGIN--Для Skyrim
#If vGameKey && WinExist("Skyrim")
SetTitleMatchMode, 2
#a:: ;Maximize Skyrim:
    WinActivate
    Sleep, 500
    Send, {Escape}
return
#IfWinExist


#If  vDubKeys && vGameKey && WinActive("Skyrim")
SetTitleMatchMode, 2
#UseHook, On  
;----Дубликаты клавиш
vk2E::vk5D
return

PgDn::PgUp
return

Home::End
return

Ins::Del
return

BS::vk22 ;NumPad3
return

vkBF::vk49 ;i
return
#UseHook, Off
#IfWinActive

#If vGameKey && WinActive("Skyrim")
SetTitleMatchMode, 2

#z:: ;Minimize Skyrim
    Send, {Escape}
    Sleep, 500
    WinMinimize, A
return

F1:: ; Основной батник
 SetKeyDelay, 10, 10
 Send {``}
 Sleep 100
 Send {Backspace}
 Send bat 1
 Sleep 100
 Send {Enter}
 Sleep 100
 Send {``}
 Sleep 1000
return

F2:: ; Сохранение в последний файл
F5::
 vSave := fnMaxName()
 vBat := "save " vSave "`r`n"
 SetKeyDelay, 10, 10
 Send {``}
 Sleep 100
 Send {Backspace}
 Send %vBat%
 Sleep 100
 Send {Enter}
 Sleep 100
 Send {``}
 Sleep 1000
return

^F2:: ; Сохранение в след. файл
 vSave := fnMaxName() + 1
 vBat := "save " vSave "`r`n"
 SetKeyDelay, 10, 10
 Send {``}
 Sleep 100
 Send {Backspace}
 Send %vBat%
 Sleep 100
 Send {Enter}
 Sleep 100
 Send {``}
 Sleep 1000
return

F3:: ; Загрузка из последнего файла
F6::
 vSave := fnMaxName()
 vBat := "load " vSave "`r`n"
 SetKeyDelay, 10, 10
 Send {``}
 Sleep 100
 Send {Backspace}
 Send %vBat%
 Sleep 100
 Send {Enter}
 Sleep 100
 Send {``}
 Sleep 1000
return


F4:: ; ON/OFF = пауза+свободная камера 
 vBat := "tfc 1"
 SetKeyDelay, 10, 10
 Send {``}
 Sleep 100
 Send {Backspace}
 Send %vBat%
 Sleep 100
 Send {Enter}
 Sleep 100
 Send {``}
 Sleep 1000
return

F10:: ; ON/OFF = клавиши дубликаты
 if (vDubKeys = 0){
  vDubKeys := 1
  ;SoundPlay ASOS_RES\ON.mp3, 1
    SoundBeep, 750, 900
 } else {
  vDubKeys := 0
  ;SoundPlay ASOS_RES\OFF.mp3, 1
    SoundBeep, 500, 300
    SoundBeep, 500, 300
    SoundBeep, 500, 300
 }
return

F12:: ; Выход быстрый с записью
 vSave := fnMaxName()
 vBat := "save " vSave "`r`n"
 SetKeyDelay, 10, 10
 Send {``}
 Sleep 100
 Send {Backspace}
 Send %vBat%
 Sleep 100
 Send {Enter}
 Sleep 1000
 vBat := "qqq"
 Sleep 100
 Send {Backspace}
 Send %vBat%
 Sleep 100
 Send {Enter} 
 Send {``}
return

^F12:: ; Выход быстрый с без записи 
 vBat := "qqq"
 SetKeyDelay, 10, 10
 Send {``}
 Sleep 100
 Send {Backspace}
 Send %vBat%
 Sleep 100
 Send {Enter}
 Sleep 100
 Send {``}
 Sleep 1000
return


fnMaxName() {
 vPathSave := "c:\Users\SASA\Documents\My Games\Skyrim\Saves\*.ess"
 vNumberSave := 0
 vNumberSaveTmp := vNumberSave
 Loop, %vPathSave%, 0, 0
  {
    vNameSave :=  SubStr(A_LoopFileName, 1,StrLen(A_LoopFileName)-4) ;пишем только имя
    vNumberSaveTmp := Abs(vNameSave)
    if (vNumberSaveTmp>vNumberSave) {
         vNumberSave := vNumberSaveTmp 
       }
  }
return vNumberSave  
}
#IfWinActive
;-----END--Для Skyrim


;-----BEGIN--Для Dungeon Siege II
;#IfWinActive ,Dungeon Siege II,
#If vGameKey && WinActive("Dungeon Siege II")
SetTitleMatchMode, 2

RShift::
LShift::
CapsLock::
   Send, {RButton Down}
   KeyWait, % A_ThisHotkey
   Send, {RButton Up}
Return

RCtrl::
LCtrl::
   Send, {LButton Down}
   KeyWait, % A_ThisHotkey
   Send, {LButton Up}
Return 

F12::
 vTxt := "opnauticus"
 send {\}{vk08}
 loop 100
  {
   Send, {vk6B}%vTxt%{ENTER}
   sleep 50
  }
 sleep 50
 Send, {ENTER}
return  
  
#IfWinActive
;-----END Для Dungeon Siege II

;-----BEGIN--Для The Witcher 2 - Assassins of Kings
#If vGameKey && WinActive("The Witcher 2")
SetTitleMatchMode, 2
#UseHook, On

Tab:: ;карта
  Send, {sc32 Down}
  KeyWait, % A_ThisHotkey
  Send, {sc32  Up}
return

F1::sc2e   ;С - персонаж
return

F3::sc24   ;J - дневник (журнал заданий)
return

F4::sc17   ;I - рюкзак (инвентарь)
return

F8::     ; Сохранить
  Send, {F5 Down}
  KeyWait, % A_ThisHotkey
  Send, {F5  Up}
return

F5::    ; Загрузить
  Send, {F9 Down}
  KeyWait, % A_ThisHotkey
  Send, {F9  Up}
return

WheelUp::      ;Взять прицел
  Send, {Home Down} 
  sleep 100
  Send, {Home  Up}
return

WheelDown::
return

#UseHook, Off
/*
; Массив подмены одной клавиши на три - одиночное/двойное нажатие и удержание.
; 1-й элемент. Клавиша реально нажимаемая (сочетания не работают). 
;     Если это cEndArr, то конец массива и стоп обработки.
;     Если это cNone,  то всё дальнейшее считается текстом и не обрабатывается функцией fnGetParamTrioKey, а так же должна заканчиваться cEndArr.
;    Далее, при cEndArr, игнорируется дальнейшая запись и происходит переход к следующей записи (строке массива).
; 2-й элемент. 1-я виртуальная клавиша, посылается при одном нажатии реальной клавиши.
; 3-й элемент. 2-я виртуальная клавиша посылается при двух нажатиях реальной клавиши.
; 4-й элемент. 3-я виртуальная клавиша посылается при удержании реальной клавиши.
; 5-й элемент. Время определяющее одиночное/двойное нажатие, при больших значениях двойное нажатие может не произойти.
; 6-й элемент. Время ожидания в цикле определения удержания за каждый шаг, при больших значениях блокирует одиночное/двойное нажатие.
; 7-й элемент. Число шагов цикла для определения удержание клавиши/кнопки, при больших значениях блокирует одиночное/двойное нажатие.
; 8-й элемент. Время задержки между эмуляцией нажатия на клавиши/кнопки подмены реально нажатой клавишей/кнопкой.
; 9-й элемент. Автоповтор реально нажатой клавиши/кнопки - включён/выключен True/False.

;Этот массив разбирается один раз при иництализации скрипта и на его основе создаётся одномерный массив
; Индексы, хотя вроде все и не нужны, но описать нужно для функций обработки.
iTrioBaseKey:=1, iTrioAloneKey:=2, iTrioDoubleKey:=3, iTrioHoldingKey:=4, iTrioPause_PressKey:=5
,iTrioWaitHoldingBaseKey:=6, iTrioCountHoldingBaseKey:=7,iTrioWaitVirtualKey:=8, iTrioAutoRepeat:=9
,iTrioEnd  ; Граничный индекс.
    
cEndArr := -1
arSetTrioKey := [[cNone]   ;------------------>>> Для The Witcher 2 - Assassins of Kings <<<<-------------------------------------
                ,["RShift", "sc10", "sc11", "sc12" ;Вызов="RShift", Серебрянный меч="Q", Стальной меч="W", Убрать оружие="E"
                ,300],[2],[25],[10],[false],[cEndArr]
                ,["RCtrl", "sc10", "sc11", "sc12" ;Вызов="RShift", Серебрянный меч="Q", Стальной меч="W", Убрать оружие="E"
                ,300],[2],[25],[10],[false],[cEndArr]
                ,[cEndArr]]
                
; Фукцая первичного разбора массива, вход подаётся:
; 1-й параметр. UIA (The unique identifier for the application), который генерируется рандомно один раз при старте скрипта.
; 2-й параметр. HotKey клавиши по которой будет осуществляться обработка.
; Возврат. False - ошибка в массиве или входных параметрах иначе индекс для получения параметров из массива arSetTrioKey                
sbGetParamTrioKey(iHoyKey)
{
  ; Общие константы переменные
  Global  arSetTrioKey, cNone, cEndArr 
          ,сMsgOptionsEr, сMsgOptionsOK, сMsgOptionsDg, сMsgOptionsInfo  
    
  ; Индексы в массиве arSetTrioKey
  Global  iTrioBaseKey, iTrioAloneKey, iTrioDoubleKey                         
          ,iTrioHoldingKey, iTrioPause_PressKey, iTrioWaitHoldingBaseKey
          ,iTrioCountHoldingBaseKey, iTrioWaitVirtualKey, iTrioAutoRepeat, iTrioEnd
    
  ; Переменные полученные из массива arSetTrioKey для подпрограммы sbTrioProcessingKeys        
  Global  BaseKey, AloneKey, DoubleKey, iTrioHoldingKey, iTrioPause_PressKey
          ,iTrioWaitHoldingBaseKey, iTrioCountHoldingBaseKey
          ,iTrioWaitVirtualKey, iTrioAutoRepeat
  
  vRet:=false
  for i in arSetTrioKey
    {
      if (arSetTrioKey[i,iTrioBaseKey]=iHoyKey)
          {
            vRet:=true   ; Нашли то что искали, будем считывать и проверять валидность.
            Break
          }
      if (arSetTrioKey[i,iTrioBaseKey]=cEndArr)
          {
            vRet:=false   ; Ничего не нашли, выход с ошибкой.
            Break
          }            
    if (arSetTrioKey[i,iTrioBaseKey]=cNone)
            Continue      ; Это пустая запись или заголовок.
    }
  if (!vRet)
        Goto lErrArr
  for j in arSetTrioKey[i]
      {
        vTmp:=arSetTrioKey[i,j]
        if ((vTmp=cNone) ||  ((vTmp=cEndArr) && (i!=iTrioEnd)))
            {
              vRet:=false
              Break
            }  
      }
  if ((!vRet) || (j<=iTrioEnd))
    {}
  lErrArr:  
    msgbox, % сMsgOptionsEr, Функция тройных клавиш, Ошибка в масссиве arSetTrioKey при поиске клавиши - %iHoyKey%, 50
return vRet
}
*/   

Enter::    
  сBaseKey              := "Enter"
  cAloneKey             := "Enter"   ; Действия по Enter
  cDoubleKey            := "Space"   ; Взять всё
  cHoldingKey           := "LButton"
  сPause_PressKey       := 300   
  cWaitHoldingBaseKey   := 1     
  cCountHoldingBaseKey  := 40   
  cWaitVirtualKey       := 5    
  cWaitBaselKey         := 10
  fAutoRepeat           := false
  gosub sbTrioProcessingKeys
return
          
RCtrl::    
  сBaseKey              := "RCtrl"  
  cAloneKey             := "RCtrl"  ;Следующий предмет
  cDoubleKey            := "End"    ;Задействовать скилл "Изпользовать адреналин для массового уничтожения"
  cHoldingKey           := "RCtrl"  ;Следующий предмет
  сPause_PressKey       := 300   
  cWaitHoldingBaseKey   := 1     
  cCountHoldingBaseKey  := 40   
  cWaitVirtualKey       := 5    
  cWaitBaselKey         := 10
  fAutoRepeat           := false
  gosub sbTrioProcessingKeys
return

;Numpad0 - что бы всегда срабатывал Медальон, в игре проблема обработки, видимо задержка ожидания нажатия.
sc52::      
  сBaseKey              := "sc52"   ;Numpad0
  cAloneKey             := "sc52"   ;Медальон 
  cDoubleKey            := "sc52"   ;Медальон
  cHoldingKey           := "sc52"   ;Медальон
  сPause_PressKey       := 300   
  cWaitHoldingBaseKey   := 1     
  cCountHoldingBaseKey  := 40   
  cWaitVirtualKey       := 5    
  cWaitBaselKey         := 10
  fAutoRepeat           := false 

  gosub sbTrioProcessingKeys
return
RShift::
;if (!Witcher2_RShift) 
 ;     return

  ;a:=A_ThisHotkey
  ;b:=A_ThisLabel
  
  сBaseKey              := "RShift"
  cAloneKey             := "sc10"     ;Q - Серебрянный меч
  cDoubleKey            := "sc11"     ;W - Стальной меч
  cHoldingKey           := "sc12"   ;E - Убрать оружие  
  сPause_PressKey       := 300   
  cWaitHoldingBaseKey   := 1     
  cCountHoldingBaseKey  := 40   
  cWaitVirtualKey       := 5    
  cWaitBaselKey         := 10
  fAutoRepeat           := false 

  gosub sbTrioProcessingKeys
return

#IfWinActive
;-----END--Для The Witcher 2 - Assassins of Kings


;lActiveWitcher:  ; Точка активации игры
;return

;lDeActiveWitcher:  ; Точка деактивации игры
;msgbox, Точка деактивации игры Для The Witcher 2
;if (arProc[1,5]=0)
;   gosub lExitProc
;return

;lPauseWitcher:  ; Точка паузы игры
;return

;RShift::
;if (fWitcher)
;RCtrl
;return





;***************END******************

И концовка, т.е. начало

;-----Инициализация
; Скрипт не выгружается
#Persistent
; Запрет повторного запуска
#SingleInstance

OnExit, EndGames

fnPathUses()          ;Иницализация путей
fnOverallSection()    ;Иницализация блока переменных
return
;----------------------------
;---Точка выхода
EndGames:
ExitApp

;----------------------------
;Пишем модуль/скрипт путей
;Пишем модуль/скрипт переменных

;Пишем модуль/скрипт для игр
;Метка GameKeyOnOff служит для динамческого/принудительного отключения игровых клавишь без выгрузки скрипта

Удачи, может кому то я и помог.

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

2

Re: Скрипт для разных игр

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

+ Подпрограммы(набор) - Три действия/клавиши в одной
;==============Подпрограмма - Три действия/клавиши в одной======================
;  сBaseKey              :=         ; Нажимаемая клавиша
;  cAloneKey             :=         ; 1-я Виртуальная клавиша
;  cDoubleKey            :=         ; 2-я Виртуальная клавиша
;  cHoldingKey           :=         ; 3-я Виртуальная клавиша
;--------------Оптимальное значение для игр и мышки на опыте игры "The Witcher 2 - Assassins of Kings"
;  сPause_PressKey       := 350    ; Если пауза меньше этого количества миллисекунд, то нажатие двойное. Если больше, то оно расценивается как 2 одиночных
;  cWaitHoldingBaseKey   := 2      ; Время ожидания в цикле определения удержания за каждый шаг, при больших значениях блокирует одиночное/двойное нажатие.
;  cCountHoldingBaseKey  := 25     ; Число шагов цикла для определения удержание клавиши/кнопки, при больших значениях блокирует одиночное/двойное нажатие.
;  cWaitVirtualKey       := 10     ; Время задержки между эмуляцией нажатия на клавиши/кнопки подмены реально нажатой клавишей/кнопкой.
;  fAutoRepeat           := false  ; Автоповтор реально нажатой клавиши/кнопки - включён/выключен True/False

;------------Начало работы      
#UseHook, On
sbTrioProcessingKeys:
; Требуется реализация блокировки от входа с разных клавиш, т.е. защита от множественного входа на време отработки этой подпрограммы.
  vCountHoldingBaseKey:=cCountHoldingBaseKey
  ;Проверка на удержание нажатия/клика клавиши/кнопки
  while ((GetKeyState(сBaseKey, "P")) && vCountHoldingBaseKey && (!сSecond_PressKey)) 
      {
        sleep %cWaitHoldingBaseKey%   
        vCountHoldingBaseKey--
      }
  if (!vCountHoldingBaseKey)
      { 
  ; Нормальное удержание не работает, нужно не посылать код отжатия, пока нажата реальная клавиша - в подпрограмме sbAutoRepeat треуется корректировка.
  ; Надо сделать режим удерживать или нет клавишу, а это ввод второго флага, может быть для всех трёх клавиш.        
        Send, {%cHoldingKey% Down}  ;Удержание нажатия/клика клавиши/кнопки
        Sleep %cWaitVirtualKey%    
        Send, {%cHoldingKey% Up}
        Gosub sbAutoRepeat
        return
      } 
     else 
        Gosub, sbPressCountKeys
return            ; Конец обработки подпрограммы sbStartProcessingKeys


;Одиночное нажатие/клик клавиши/кнопки
sbAloneKey:
  Send, {%cAloneKey% Down}
  Sleep %cWaitVirtualKey%    
  Send, {%cAloneKey% Up}
  Gosub sbAutoRepeat
Return

;Двойное нажатие/клик клавиши/кнопки
sbDoubleKey:
  Send, {%cDoubleKey% Down}
  Sleep %cWaitVirtualKey%    
  Send, {%cDoubleKey% Up}  
  Gosub sbAutoRepeat
Return

;Без/С автоповтором основной клавиши/кнопки
sbAutoRepeat:
  if (!fAutoRepeat)
      {
        Send, {%сBaseKey% Down}   ; Без автоповтора
        ;while (GetKeyState(сBaseKey, "P"))
        KeyWait, %сBaseKey%  ;Sleep %cWaitBaselKey% 
        Send, {%сBaseKey% Up}      
      }
Return                            ; C автоповтором

#UseHook, Off

sbPressCountKeys:
  If not сSecond_PressKey
      {
        сSecond_PressKey := 1
        SetTimer, sbDoublePressKey, -%сPause_PressKey%
      }
    Else
      {
        сSecond_PressKey := 0
        SetTimer, sbDoubleKey, -1
      }
Return

sbDoublePressKey:
  If not сSecond_PressKey
        Return
  сSecond_PressKey := 0
  SetTimer, sbAloneKey, -1
Return
;-----------------------------------------------------------------

Данный блок унифицирован, так что достаточно описать и вызвать подпрограмму - пример из Ведьмака

Enter::    
  сBaseKey              := "Enter"
  cAloneKey             := "Enter"   ; Действия по Enter
  cDoubleKey            := "Space"   ; Взять всё
  cHoldingKey           := "LButton"
  сPause_PressKey       := 300   
  cWaitHoldingBaseKey   := 1     
  cCountHoldingBaseKey  := 40   
  cWaitVirtualKey       := 5    
  cWaitBaselKey         := 10
  fAutoRepeat           := false
  gosub sbTrioProcessingKeys
return
"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

3 (изменено: Indomito, 2014-07-12 05:08:41)

Re: Скрипт для разных игр

И опять забыл
Строчку сBaseKey := "Enter" заменить на сBaseKey := A_ThisHotkey
И для верности, её написать в подпрограмме sbTrioProcessingKeys первой строкой, что бы более не заморачиваться

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