1 (изменено: kharlashkin, 2014-05-01 22:09:07)

Тема: Отправка нажатий клавиш в неактивное окно World of Tanks

Тема создана, чтобы не оффтопить в http://forum.script-coding.com/viewtopic.php?id=8507.

Я довольно долго исследую тему относительно использования игры WoT в режиме Разделенного экрана или SplitScreen (подробнее тут - http://www.koreanrandom.com/forum/topic … it-screen/).
Знакомство с AutoHotkey позволило подойти к последнему рубежу, а именно отправлять команды в клиент игры в неактивном окне.
Первоначальный скрипт в вышеуказанной теме срабатывает(неиграбельно и кое-как), но необходимо попробовать решить более корректно этот вопрос.

2

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

bWRmeA пишет:

Кому надо? Никому не надо. В блокноте работает, проект сдан.

У меня не работает и в блокноте.

SetControlDelay -1 ; избавляемся от внутреннего таймаута интерпретатора 
title := "Безымянный - Блокнот"

#if WinActive(title) ; при каждом нажатии wasd ищем активное окно, если найденное окно имеет нужный загловок устанавливаем lastFound

~*vk57::
~*vk41::
~*vk53::
~*vk44::HotkeyProxy(NextWindow(title))

#if

HotkeyProxy(hwnd) {
    key := "{Blind}{" RegExReplace(A_ThisHotkey, "^[^\w\d]+") "}"
    ControlSend,, % key, ahk_id %hwnd%
}

NextWindow(title) {
    WinGet hwndList, List, % title
    loop % hwndList
        if (hwndList%A_Index% <> WinExist())
            return hwndList%A_Index%
}

Подскажите неучу Кстати WoT понимает только нажатия клавиш вот python код:

import Event
g_instance = None

class _InputHandler:
    onKeyDown = Event.Event()
    onKeyUp = Event.Event()

    def handleKeyEvent(self, event):
        if event.isKeyDown():
            self.onKeyDown(event)
        else:
            self.onKeyUp(event)


g_instance = _InputHandler()

3

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Вроде решается проблема добавлением некоего обмана приложения

vk49::
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {vk57 Down}, WoT Client
KeyWait, vk49
ControlSend,, {vk57 Up}, WoT Client
Return

4 (изменено: kharlashkin, 2014-06-05 17:49:37)

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Помогите со скриптом для геймпада, пожалуйста.
Собственно скрипт отправляющий в окошко игра стрелки:

#Persistent
SetTimer, WatchAxis, 10
return

WatchAxis:
GetKeyState, JoyZ, JoyZ
GetKeyState, JoyR, JoyR
KeyToHoldDownPrev = %KeyToHoldDown%

if JoyZ > 70
    KeyToHoldDown = Right
else if JoyZ < 30
    KeyToHoldDown = Left
else if JoyR > 70
    KeyToHoldDown = Down
else if JoyR < 30
    KeyToHoldDown = Up
else
    KeyToHoldDown =

if KeyToHoldDown = %KeyToHoldDownPrev%
    return

SetKeyDelay -1
if KeyToHoldDownPrev
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%KeyToHoldDownPrev% up}, WoT Client
}
if KeyToHoldDown
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%KeyToHoldDown% down}, WoT Client
}
return

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

5

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Доработал скрипт:

#Persistent
SetTimer, WatchAxisMoveForward, 10
SetTimer, WatchAxisMoveRotate, 10
SetTimer, WatchAxisCameraRotateVert, 10
SetTimer, WatchAxisCameraRotateHoriz, 10
return

WatchAxisMoveForward:
GetKeyState, JoyY, JoyY
MoveForwardPrev = %MoveForward%

if JoyY > 70
    MoveForward = s
else if JoyY < 30
    MoveForward = w
else
    MoveForward =

if MoveForward = %MoveForwardPrev%
    return

SetKeyDelay -1
if MoveForward
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%MoveForward% down}, WoT Client
}
if MoveForwardPrev
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%MoveForwardPrev% up}, WoT Client
}
return

WatchAxisMoveRotate:
GetKeyState, JoyX, JoyX
MoveRotatePrev = %MoveRotate%

if JoyX > 70
    MoveRotate = d
else if JoyX < 30
    MoveRotate = a
else
    MoveRotate =

if MoveRotate = %MoveRotatePrev%
    return

SetKeyDelay -1
if MoveRotate
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%MoveRotate% down}, WoT Client
}
if MoveRotatePrev
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%MoveRotatePrev% up}, WoT Client
}
return

WatchAxisCameraRotateVert:
GetKeyState, JoyR, JoyR
CameraRotateVertPrev = %CameraRotateVert%

if JoyR > 70
    CameraRotateVert = Down
else if JoyR < 30
    CameraRotateVert = Up
else
    CameraRotateVert =

if CameraRotateVert = %CameraRotateVertPrev%
    return

SetKeyDelay -1
if CameraRotateVert
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%CameraRotateVert% down}, WoT Client
}
if CameraRotateVertPrev
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%CameraRotateVertPrev% up}, WoT Client
}
return

WatchAxisCameraRotateHoriz:
GetKeyState, JoyZ, JoyZ
CameraRotateHorizPrev = %CameraRotateHoriz%

if JoyZ > 70
    CameraRotateHoriz = Right
else if JoyZ < 30
    CameraRotateHoriz = Left
else
    CameraRotateHoriz =

if CameraRotateHoriz = %CameraRotateHorizPrev%
    return

SetKeyDelay -1
if CameraRotateHoriz
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%CameraRotateHoriz% down}, WoT Client
}
if CameraRotateHorizPrev
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%CameraRotateHorizPrev% up}, WoT Client
}
return

Joy12::
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {LShift Down}, WoT Client
KeyWait, Joy12
ControlSend,, {LShift Up}, WoT Client
Return

Joy8::
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {Space Down}, WoT Client
KeyWait, Joy8
ControlSend,, {Space Up}, WoT Client
Return

Может кто сталкивался с отправкой движений мыши в неактивное окно?

6

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Копаю возможность отправлять перемещения мыши в неактивное окно.
Скрипт даже не запускается, помогите, люди добрые!

#SingleInstance
SetTimer, WatchJoystick, 10
JoyThresholdUpper := 50 + JoyThreshold
JoyThresholdLower := 50 - JoyThreshold
JoyMultiplier = 0.30
JoyThreshold = 3
InvertYAxis := false
if InvertYAxis
    YAxisMultiplier = -1
else
    YAxisMultiplier = 1

WatchJoystick:
GetKeyState, joyx, 1JoyX
GetKeyState, joyy, 1JoyY
MouseNeedsToBeMoved := false

if joyx > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaX := joyx - JoyThresholdUpper
}
else if joyx < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaX := joyx - JoyThresholdLower
}
else
    DeltaX = 0
if joyy > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaY := joyy - JoyThresholdUpper
}
else if joyy < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaY := joyy - JoyThresholdLower
}
else
    DeltaY = 0

if MouseNeedsToBeMoved
{
MakeLong( LoWord, HiWord ) {
 return (HiWord << 16) | (LoWord & 0xffff)
}

lParam := MakeLong( DeltaX * JoyMultiplier, DeltaY * JoyMultiplier * YAxisMultiplier )
SendMessage, 0x200, 0, %lParam%,, WoT Client
}
return

7

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Не запускается в смысле ошибку выводит? Тогда какую. Ванговать тут никому не охота.

8 (изменено: kharlashkin, 2014-06-11 11:26:49)

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

YMP пишет:

Не запускается в смысле ошибку выводит? Тогда какую. Ванговать тут никому не охота.

В том то и дело что не выводит никакую ошибку, окошко AHK появляется в трее на доли секунды и исчезает.
Если нужны дополнительные параметры системы: AutoHotkey v1.1.14.04, Windows 7 Профессиональная 64 бита, процессор AMD A4-4300M, ОЗУ 4 ГБ,

9

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

#Persistent
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

10 (изменено: kharlashkin, 2014-06-11 12:14:49)

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

teadrinker пишет:
#Persistent

Спасибо, теперь интереснее, скрипт работает но мышку не двигает в окне "WoT Client". Вопрос в другом а должен?

11

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Вообще в играх — нет, не обязан, как повезёт. А конкретно про эту не в курсе.

12

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

YMP пишет:

Вообще в играх — нет, не обязан, как повезёт. А конкретно про эту не в курсе.

В Paint тоже не отправляет...

13

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Может кто подскажет реально работающий скрипт, например рисование каракули в Paint?

14

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Для начала, где в вашем скрипте модуль, отвечающий за движение мыши? Я не нашёл.

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

15 (изменено: kharlashkin, 2014-06-11 16:12:14)

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

teadrinker пишет:

Для начала, где в вашем скрипте модуль, отвечающий за движение мыши? Я не нашёл.

Прошу прощения, а он нужен? Если да, ткните носом где подсмотреть можно, что нужно.
Есть перемещения стика в геймпаде, оттуда берутся данные для мыши (координаты x, y) и хочу попробовать отдавать эти координаты через SendMessage не активному окну.
Скрипт делался на основе http://www.autohotkey.com/docs/scripts/ … kMouse.htm, соответственно было заменено:
SetMouseDelay, -1  ; Makes movement smoother.
MouseMove, DeltaX * JoyMultiplier, DeltaY * JoyMultiplier * YAxisMultiplier, 0, R
на попытку отправить сообщение через SendMessage, как основу взял скрипт отсюда http://www.autohotkey.com/board/topic/6 … ntry432251

16

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

kharlashkin пишет:

Прошу прощения, а он нужен?

М-м-м... честно говоря, не знаю. С Paint'ом так получилось:

If !WinExist("ahk_class MSPaintApp")
   Run, mspaint.exe
WinWait, ahk_class MSPaintApp
WinGet, List, ControlList
Loop, parse, List, `n
   if RegExMatch(A_LoopField, "i)^Afx:[0-9A-F]+:8\d", Found)
      break

x := 10, y := 200
PostMessage, WM_LBUTTONDOWN := 0x201,, x|(y<<16), % Found
Loop 30
{
   x += A_Index
   PostMessage, WM_MOUSEMOVE := 0x200,, x|(y<<16), % Found
   Sleep, 10
}
PostMessage, WM_LBUTTONUP := 0x202,, x|(y<<16), % Found
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

17

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

teadrinker пишет:
kharlashkin пишет:

Прошу прощения, а он нужен?

М-м-м... честно говоря, не знаю. С Paint'ом так получилось:

If !WinExist("ahk_class MSPaintApp")
   Run, mspaint.exe
WinWait, ahk_class MSPaintApp
WinGet, List, ControlList
Loop, parse, List, `n
   if RegExMatch(A_LoopField, "i)^Afx:[0-9A-F]+:8\d", Found)
      break

x := 10, y := 200
PostMessage, WM_LBUTTONDOWN := 0x201,, x|(y<<16), % Found
Loop 30
{
   x += A_Index
   PostMessage, WM_MOUSEMOVE := 0x200,, x|(y<<16), % Found
   Sleep, 10
}
PostMessage, WM_LBUTTONUP := 0x202,, x|(y<<16), % Found

Ага-ага, буду изучать. Спасибо огромнейшее!!!

18 (изменено: kharlashkin, 2014-06-12 13:05:47)

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Итак, в этом скрипте нажатие кнопки мыши отрабатывает, а вот перемещение нет. Имеется ввиду WoT конечно...

Может есть ещё какой способ?

19

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

А может,  у вас ошибка где-то,  напишите свой вариант скрипта.

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

20 (изменено: kharlashkin, 2014-06-12 14:23:07)

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

teadrinker пишет:

А может,  у вас ошибка где-то,  напишите свой вариант скрипта.

WinWait, WoT Client
WinGet, List, ControlList
Loop, parse, List, `n
   if RegExMatch(A_LoopField, "i)^Afx:[0-9A-F]+:8\d", Found)
      break

x := 100, y := 200
Loop 30
{
   x += A_Index
   SendMessage, WM_MOUSEMOVE := 0x200,, x|(y<<16), % Found
   Sleep, 1000
}

Когда дополнительно скрипт отправлял нажатия левой кнопки мыши, танк стрелял в бою Но камера не двигается.

Нашел темку похожую http://forum.script-coding.com/viewtopic.php?id=7298, сижу читаю

21

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Эта часть

WinGet, List, ControlList
Loop, parse, List, `n
   if RegExMatch(A_LoopField, "i)^Afx:[0-9A-F]+:8\d", Found)
      break

только для Paint'а. Вам нужно самостоятельно (с помощью Window Spy) определить название контрола, куда посылать сообщения.

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

22 (изменено: kharlashkin, 2014-06-12 16:22:04)

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

teadrinker пишет:

Эта часть только для Paint'а. Вам нужно самостоятельно (с помощью Window Spy) определить название контрола, куда посылать сообщения.

Объясните дураку что и где взять...
Это вместо вот этого "i)^Afx:[0-9A-F]+:8\d", я не могу понять где Вы это взяли. Пробую и Window Spy которая идет с AHK, и скачал вот этот скрипт https://raw.githubusercontent.com/serzh … AhkSpy.ahk Что ничего похожего на Control окна не могу найти.
Наверное оно?

23 (изменено: kharlashkin, 2014-06-12 16:22:38)

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Тогда для танков ничего подобного нет.

24

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Можно попробовать такой вариант, эмулирующий горизонтальное движение мыши в окне клиента:

x := 20, y := 200
Loop 30
{
   x += A_Index
   SendMessage, WM_MOUSEMOVE := 0x200,, x|(y<<16),, ahk_class App ahk_exe WorldOfTanks.exe
   Sleep, 100
}

Есть какая-то реакция?

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

25 (изменено: kharlashkin, 2014-06-12 16:56:01)

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

teadrinker пишет:

Есть какая-то реакция?

Нет. Если честно признаться я пробовал уже и PID-у отправлять и exe-шнику, ни SendMessage, ни PostMessage движения мыши не отправляет, клавиши - без проблем.
Пробовал через DllCall() - результата "0". Скорее всего не получиться никак.
Если кто соображает в python, может подтолкнет к решению вот этот скрипт оригинальный. Вроде отвечает за движение курсора в игре:

import BigWorld
import GUI
import Math
from debug_utils import *
from bwdebug import WARNING_MSG
_mouseModeRefCount = 0

def showCursor(show):
    global _mouseModeRefCount
    if show:
        _mouseModeRefCount += 1
        if _mouseModeRefCount > 0:
            BigWorld.setCursor(GUI.mcursor())
            GUI.mcursor().visible = True
    else:
        _mouseModeRefCount -= 1
        if _mouseModeRefCount == 0:
            BigWorld.setCursor(BigWorld.dcursor())
            GUI.mcursor().visible = False
        if _mouseModeRefCount < 0:
            WARNING_MSG('mouseModeRefCount is negative!')


def forceShowCursor(show):
    if show:
        BigWorld.setCursor(GUI.mcursor())
        GUI.mcursor().visible = True
    else:
        BigWorld.setCursor(BigWorld.dcursor())
        GUI.mcursor().visible = False


def pixelPosition():
    screenWidth, screenHeight = GUI.screenResolution()
    mouseLeft, mouseTop = GUI.mcursor().position
    width = round((1.0 + mouseLeft) / 2.0 * screenWidth)
    height = round(-(-1.0 + mouseTop) / 2.0 * screenHeight)
    return (width, height)

26

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Есть в Windows функция-  управление курсором с помощью цифрового блока клавиатуры, подробнее http://windows.microsoft.com/ru-ru/wind … se-pointer. нельзя ли эту функцию каким то образом использовать?

27

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Если нужно реально перемещать курсор, а не эмулировать его движения, используйте MouseMove.

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

28

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

teadrinker пишет:

Если нужно реально перемещать курсор, а не эмулировать его движения, используйте MouseMove.

В неактивном окне?

29

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

В неактивном окне вряд ли поможет. Но есть только два варианта: либо реально перемещать курсор (и тут без разницы, какие средства использовать), либо эмулировать его перемещения.

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

30

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

teadrinker пишет:

В неактивном окне вряд ли поможет. Но есть только два варианта: либо реально перемещать курсор (и тут без разницы, какие средства использовать), либо эмулировать его перемещения.

В том то и дело, что все что можно нагуглить - это отправка сообщений Control окна, но это мы с Вами уже пробовали. Кстати огромнейшее СПАСИБО Вам!!!

31 (изменено: kharlashkin, 2014-06-16 00:09:16)

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

kharlashkin пишет:

В том то и дело, что все что можно нагуглить - это отправка сообщений Control окна, но это мы с Вами уже пробовали. Кстати огромнейшее СПАСИБО Вам!!!

Скорее всего разработчики игры используют RAW Input - это можно победить?

Допилил немного скрипт:

#Persistent
SetTimer, WatchAxisFirstJoyMoveForward, 10
SetTimer, WatchAxisFirstJoyMoveRotate, 10
SetTimer, WatchAxisFirstJoyCameraRotateVert, 10
SetTimer, WatchAxisFirstJoyCameraRotateHoriz, 10
SetTimer, WatchAxisFirstJoyShoot, 10
SetTimer, WatchFirstJoyPOV, 10
return

;;;;;;;;;;;;

WatchAxisFirstJoyMoveForward:
GetKeyState, 1JoyY, 1JoyY
FirstJoyMoveForwardPrev = %FirstJoyMoveForward%

if 1JoyY > 70
    FirstJoyMoveForward = vk53
else if 1JoyY < 30
    FirstJoyMoveForward = vk57
else
    FirstJoyMoveForward =

if FirstJoyMoveForward = %FirstJoyMoveForwardPrev%
    return

SetKeyDelay -1
if FirstJoyMoveForward
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%FirstJoyMoveForward% down}, WoT Client
}
if FirstJoyMoveForwardPrev
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%FirstJoyMoveForwardPrev% up}, WoT Client
}
return

;;;;;;;;;;;;

WatchAxisFirstJoyMoveRotate:
GetKeyState, 1JoyX, 1JoyX
FirstJoyMoveRotatePrev = %FirstJoyMoveRotate%

if 1JoyX > 80
    FirstJoyMoveRotate = vk44
else if 1JoyX < 20
    FirstJoyMoveRotate = vk41
else
    FirstJoyMoveRotate =

if FirstJoyMoveRotate = %FirstJoyMoveRotatePrev%
    return

SetKeyDelay -1
if FirstJoyMoveRotate
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%FirstJoyMoveRotate% down}, WoT Client
}
if FirstJoyMoveRotatePrev
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%FirstJoyMoveRotatePrev% up}, WoT Client
}
return

;;;;;;;;;;;;

WatchAxisFirstJoyCameraRotateVert:
GetKeyState, 1JoyU, 1JoyU
FirstJoyCameraRotateVertPrev = %FirstJoyCameraRotateVert%

if 1JoyU > 70
    FirstJoyCameraRotateVert = Right
else if 1JoyU < 30
    FirstJoyCameraRotateVert = Left
else
    FirstJoyCameraRotateVert =

if FirstJoyCameraRotateVert = %FirstJoyCameraRotateVertPrev%
    return

SetKeyDelay -1
if FirstJoyCameraRotateVert
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%FirstJoyCameraRotateVert% down}, WoT Client
}
if FirstJoyCameraRotateVertPrev
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%FirstJoyCameraRotateVertPrev% up}, WoT Client
}
return

;;;;;;;;;;;;

WatchAxisFirstJoyCameraRotateHoriz:
GetKeyState, 1JoyR, 1JoyR
FirstJoyCameraRotateHorizPrev = %FirstJoyCameraRotateHoriz%

if 1JoyR > 70
    FirstJoyCameraRotateHoriz = Down
else if 1JoyR < 30
    FirstJoyCameraRotateHoriz = Up
else
    FirstJoyCameraRotateHoriz =

if FirstJoyCameraRotateHoriz = %FirstJoyCameraRotateHorizPrev%
    return

SetKeyDelay -1
if FirstJoyCameraRotateHoriz
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%FirstJoyCameraRotateHoriz% down}, WoT Client
}
if FirstJoyCameraRotateHorizPrev
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%FirstJoyCameraRotateHorizPrev% up}, WoT Client
}
return

;;;;;;;;;;;;

WatchAxisFirstJoyShoot:
GetKeyState, 1JoyZ, 1JoyZ
FirstJoyShootPrev = %FirstJoyShoot%

if 1JoyZ < 30
    FirstJoyShoot = vk01
else
    FirstJoyShoot =

if FirstJoyShoot = %FirstJoyShootPrev%
    return

SetKeyDelay -1
if FirstJoyShoot
{
SendMessage, 0x201,,,, WoT Client
}
if FirstJoyShootPrev
{
SendMessage, 0x202,,,, WoT Client
}
return

;;;;;;;;;;;;;

WatchFirstJoyPOV:
GetKeyState, 1JoyPOV, 1JoyPOV
FirstJoyPOVPrev = %FirstJoyPOV%

if 1JoyPOV = 0
    FirstJoyPOV = vk52
else if 1JoyPOV = 18000
    FirstJoyPOV = vk46
else if 1JoyPOV = 27000
    FirstJoyPOV = vk58
else if 1JoyPOV = 9000
    FirstJoyPOV = vk43
else FirstJoyPOV = 


if FirstJoyPOV = %FirstJoyPOVPrev%
return

SetKeyDelay -1
if FirstJoyPOV
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%FirstJoyPOV% down}, WoT Client
}
if FirstJoyPOVPrev
{
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {%FirstJoyPOVprev% up}, WoT Client
}
return


;;;;;;;;;;;;

1Joy10::
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {vkA0 Down}, WoT Client
KeyWait, 1Joy10
ControlSend,, {vkA0 Up}, WoT Client
Return

;;;;;;;;;;;;

1Joy9::
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {vk20 Down}, WoT Client
KeyWait, 1Joy9
ControlSend,, {vk20 Up}, WoT Client
Return

;;;;;;;;;;;;

1Joy1::
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {vk54 Down}, WoT Client
KeyWait, 1Joy1
ControlSend,, {vk54 Up}, WoT Client
Return

;;;;;;;;;;;;

1Joy3::
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {vk31 Down}, WoT Client
KeyWait, 1Joy3
ControlSend,, {vk31 Up}, WoT Client
Return

;;;;;;;;;;;;

1Joy4::
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {vk32 Down}, WoT Client
KeyWait, 1Joy4
ControlSend,, {vk32 Up}, WoT Client
Return

;;;;;;;;;;;;

1Joy2::
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {vk33 Down}, WoT Client
KeyWait, 1Joy2
ControlSend,, {vk33 Up}, WoT Client
Return

;;;;;;;;;;;;

1Joy6::
SendMessage, 0x204, 1,,, WoT Client
KeyWait, 1Joy6
SendMessage, 0x205, 1,,, WoT Client
Return

;;;;;;;;;;;;

1Joy8::
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {vk1B Down}, WoT Client
KeyWait, 1Joy8
ControlSend,, {vk1B Up}, WoT Client
Return

;;;;;;;;;;;;

1Joy7::
SendMessage, 0x06, 1,,, WoT Client
ControlSend,, {vk4D Down}, WoT Client
KeyWait, 1Joy7
ControlSend,, {vk4D Up}, WoT Client
Return

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

32 (изменено: kharlashkin, 2014-06-16 13:14:45)

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Не знаю правильно ли, но вроде работает "защита":

#Persistent
SetTimer, WatchAxisFirstJoyMoveForward, 10
SetTimer, WatchAxisFirstJoyMoveRotate, 10
SetTimer, WatchAxisFirstJoyCameraRotateVert, 10
SetTimer, WatchAxisFirstJoyCameraRotateHoriz, 10
SetTimer, WatchAxisFirstJoyShoot, 10
SetTimer, WatchFirstJoyPOV, 10
return

;;;;;;;;;;;;

WatchAxisFirstJoyMoveForward:
GetKeyState, 1JoyY, 1JoyY
FirstJoyMoveForwardPrev = %FirstJoyMoveForward%

if 1JoyY > 70
    FirstJoyMoveForward = vk53
else if 1JoyY < 30
    FirstJoyMoveForward = vk57
else
    FirstJoyMoveForward =

if FirstJoyMoveForward = %FirstJoyMoveForwardPrev%
    return

SetKeyDelay -1
if FirstJoyMoveForward
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyMoveForward% down}, WoT Client
    }
}
if FirstJoyMoveForwardPrev
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyMoveForwardPrev% up}, WoT Client
    }
}
return

;;;;;;;;;;;;

WatchAxisFirstJoyMoveRotate:
GetKeyState, 1JoyX, 1JoyX
FirstJoyMoveRotatePrev = %FirstJoyMoveRotate%

if 1JoyX > 80
    FirstJoyMoveRotate = vk44
else if 1JoyX < 20
    FirstJoyMoveRotate = vk41
else
    FirstJoyMoveRotate =

if FirstJoyMoveRotate = %FirstJoyMoveRotatePrev%
    return

SetKeyDelay -1
if FirstJoyMoveRotate
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyMoveRotate% down}, WoT Client
    }
}
if FirstJoyMoveRotatePrev
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyMoveRotatePrev% up}, WoT Client
    }
}
return

;;;;;;;;;;;;

WatchAxisFirstJoyCameraRotateVert:
GetKeyState, 1JoyU, 1JoyU
FirstJoyCameraRotateVertPrev = %FirstJoyCameraRotateVert%

if 1JoyU > 70
    FirstJoyCameraRotateVert = Right
else if 1JoyU < 30
    FirstJoyCameraRotateVert = Left
else
    FirstJoyCameraRotateVert =

if FirstJoyCameraRotateVert = %FirstJoyCameraRotateVertPrev%
    return

SetKeyDelay -1
if FirstJoyCameraRotateVert
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyCameraRotateVert% down}, WoT Client
    }
}
if FirstJoyCameraRotateVertPrev
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyCameraRotateVertPrev% up}, WoT Client
    }
}
return

;;;;;;;;;;;;

WatchAxisFirstJoyCameraRotateHoriz:
GetKeyState, 1JoyR, 1JoyR
FirstJoyCameraRotateHorizPrev = %FirstJoyCameraRotateHoriz%

if 1JoyR > 70
    FirstJoyCameraRotateHoriz = Down
else if 1JoyR < 30
    FirstJoyCameraRotateHoriz = Up
else
    FirstJoyCameraRotateHoriz =

if FirstJoyCameraRotateHoriz = %FirstJoyCameraRotateHorizPrev%
    return

SetKeyDelay -1
if FirstJoyCameraRotateHoriz
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyCameraRotateHoriz% down}, WoT Client
    }
}
if FirstJoyCameraRotateHorizPrev
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyCameraRotateHorizPrev% up}, WoT Client
    }
}
return

;;;;;;;;;;;;

WatchAxisFirstJoyShoot:
GetKeyState, 1JoyZ, 1JoyZ
FirstJoyShootPrev = %FirstJoyShoot%

if 1JoyZ < 30
    FirstJoyShoot = vk01
else
    FirstJoyShoot =

if FirstJoyShoot = %FirstJoyShootPrev%
    return

SetKeyDelay -1
if FirstJoyShoot
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x201,,,, WoT Client
    }
}
if FirstJoyShootPrev
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x202,,,, WoT Client
    }
}
return

;;;;;;;;;;;;;

WatchFirstJoyPOV:
GetKeyState, 1JoyPOV, 1JoyPOV
FirstJoyPOVPrev = %FirstJoyPOV%

if 1JoyPOV = 0
    FirstJoyPOV = vk52
else if 1JoyPOV = 18000
    FirstJoyPOV = vk46
else if 1JoyPOV = 27000
    FirstJoyPOV = vk58
else if 1JoyPOV = 9000
    FirstJoyPOV = vk43
else FirstJoyPOV = 


if FirstJoyPOV = %FirstJoyPOVPrev%
return

SetKeyDelay -1
if FirstJoyPOV
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyPOV% down}, WoT Client
    }
}
if FirstJoyPOVPrev
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyPOVprev% up}, WoT Client
    }
}
return

;;;;;;;;;;;;

1Joy10::
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vkA0 Down}, WoT Client
    KeyWait, 1Joy10
    ControlSend,, {vkA0 Up}, WoT Client
    }
}
Return

;;;;;;;;;;;;

1Joy9::
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk20 Down}, WoT Client
    KeyWait, 1Joy9
    ControlSend,, {vk20 Up}, WoT Client
    }
}
Return

;;;;;;;;;;;;

1Joy1::
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk54 Down}, WoT Client
    KeyWait, 1Joy1
    ControlSend,, {vk54 Up}, WoT Client
    }
}
Return

;;;;;;;;;;;;

1Joy3::
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk31 Down}, WoT Client
    KeyWait, 1Joy3
    ControlSend,, {vk31 Up}, WoT Client
    }
}
Return

;;;;;;;;;;;;

1Joy4::
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk32 Down}, WoT Client
    KeyWait, 1Joy4
    ControlSend,, {vk32 Up}, WoT Client
    }
}
Return

;;;;;;;;;;;;

1Joy2::
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk33 Down}, WoT Client
    KeyWait, 1Joy2
    ControlSend,, {vk33 Up}, WoT Client
    }
}
Return

;;;;;;;;;;;;

1Joy6::
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x204, 1,,, WoT Client
    KeyWait, 1Joy6
    SendMessage, 0x205, 1,,, WoT Client
    }
}
Return

;;;;;;;;;;;;

1Joy8::
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk1B Down}, WoT Client
    KeyWait, 1Joy8
    ControlSend,, {vk1B Up}, WoT Client
    }
}
Return

;;;;;;;;;;;;

1Joy7::
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk4D Down}, WoT Client
    KeyWait, 1Joy7
    ControlSend,, {vk4D Up}, WoT Client
    }
}
Return

33

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Хочу попросить помощи у сообщества в организации следующего алгоритма.
Сейчас на кнопки геймпада "X", "Y" и "B" назначены просто цифры "1, "2" и "3", которые в игре служат для выбора типа снарядов.
Хочу на них повесить сочетание, например если нажата кнопка "X" и двигаешь левый стик влево, то в игру отправляется "1", если нажата кнопка "X" и двигаешь левый стик вверх - отправляется "2", если "Х" и вправо - то "3".
Если же кнопка "Х" не нажата то левый стик работает как обчно - то есть отправляет клавиши "WASD".
Подскажите где посмотреть на пример.

34

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

ControlSend,, {%FirstJoyMoveForward% down}, WoT Client

А ahk_parent в этой команде не помогает?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

35 (изменено: kharlashkin, 2014-06-16 14:24:05)

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

serzh82saratov пишет:
ControlSend,, {%FirstJoyMoveForward% down}, WoT Client

А ahk_parent в этой команде не помогает?

Насколько я понимаю (если неправильно поправьте меня) - этот параметр отправляет команды непосредственно exe-шнику, т.е. WorldofTanks.exe.

Никаким способом кроме обмана (SendMessage, 0x06, 1,,, WoT Client) мне не удалось заставить игру принимать нажатия клавиш, пробовал и exe, и PID. Вернее даже не так, команды отправлялись и игра их принимала, но только лишь тогда когда окно становилось активным. Подробнее в этом сообщении.

36

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

serzh82saratov пишет:
ControlSend,, {%FirstJoyMoveForward% down}, WoT Client

А ahk_parent в этой команде не помогает?

Специально проверил - эффект тот же, скрипт отправляет команды, но принимаются только после активации окна.

#Persistent
SetTimer, WatchAxisFirstJoyMoveForward, 10
return

;;;;;;;;;;;;

WatchAxisFirstJoyMoveForward:
GetKeyState, 1JoyY, 1JoyY
FirstJoyMoveForwardPrev = %FirstJoyMoveForward%

if 1JoyY > 70
    FirstJoyMoveForward = vk53
else if 1JoyY < 30
    FirstJoyMoveForward = vk57
else
    FirstJoyMoveForward =

if FirstJoyMoveForward = %FirstJoyMoveForwardPrev%
    return

SetKeyDelay -1
IfWinNotActive, WoT Client
if FirstJoyMoveForward
{
IfWinNotActive, WoT Client
    {
    ControlSend, ahk_parent, {%FirstJoyMoveForward% down}, WoT Client
    }
}
if FirstJoyMoveForwardPrev
{
IfWinNotActive, WoT Client
    {
    ControlSend, ahk_parent, {%FirstJoyMoveForwardPrev% up}, WoT Client
    }
}
return

37

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

kharlashkin пишет:

Если же кнопка "Х" не нажата то левый стик работает как обчно - то есть отправляет клавиши "WASD".
Подскажите где посмотреть на пример.

Вроде разобрался - этот код работает:

#Persistent
SetTimer, WatchAxisFirstSwitchAmmoTypes, 10
return

;;;;;;;;;;;;

WatchAxisFirstSwitchAmmoTypes:
GetKeyState, 1JoyX, 1JoyX
GetKeyState, 1Joy1, 1Joy1
FirstSwitchAmmoTypesPrev = %FirstSwitchAmmoTypes%

if (1Joy1 = "D") & (1JoyX < 30)
    FirstSwitchAmmoTypes = vk32
else
    FirstSwitchAmmoTypes =

if FirstSwitchAmmoTypes = %FirstSwitchAmmoTypesPrev%
    return

SetKeyDelay -1
if FirstSwitchAmmoTypes
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstSwitchAmmoTypes% down}, WoT Client
    }
}
if FirstSwitchAmmoTypesPrev
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstSwitchAmmoTypesPrev% up}, WoT Client
    }
}
return

38 (изменено: kharlashkin, 2014-06-19 13:24:38)

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Пришла беда откуда не ждали... Не могу двигать мышью в бою, убил вечер на формулу движения мышкой через mousemove, в ангаре и в Windows двигается как надо, в игре прицел очень сильно дергается  - в общем неиграбельно.

+ открыть спойлер
JoyMultiplier = 10

JoyThreshold = 5

InvertYAxis := false

#SingleInstance
#Persistent
JoyThresholdUpper := 50 + JoyThreshold
JoyThresholdLower := 50 - JoyThreshold
if InvertYAxis
    YAxisMultiplier = -1
else
    YAxisMultiplier = 1

SetTimer, WatchJoystick, 10

WatchJoystick:
MouseNeedsToBeMoved := false
SetFormat, float, 03
GetKeyState, joyu, 1JoyU
GetKeyState, joyr, 1JoyR
if joyu > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaU := joyu - JoyThresholdUpper
}
else if joyu < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaU := joyu - JoyThresholdLower
}
else
    DeltaU = 0
if joyr > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaR := joyr - JoyThresholdUpper
}
else if joyr < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaR := joyr - JoyThresholdLower
}
else
    DeltaR = 0

if MouseNeedsToBeMoved
{
        SetMouseDelay, -1  ; Makes movement smoother 
    MouseMove, (DeltaU/30) * (ABS(DeltaU)/30) * JoyMultiplier, (DeltaR/30) * (ABS(DeltaR)/30) * JoyMultiplier * YAxisMultiplier, 0, R
}
return

Где-то встречал про "глобальные перемещения" мыши, для игр с прицелом. Может кто подскажет?

39 (изменено: kharlashkin, 2014-06-19 13:39:27)

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Ложная тревога, практически сразу решилась проблема:

JoyMultiplier = 10

JoyThreshold = 5

#SingleInstance
#Persistent
JoyThresholdUpper := 50 + JoyThreshold
JoyThresholdLower := 50 - JoyThreshold

SetTimer, WatchJoystick, 10

WatchJoystick:
MouseNeedsToBeMoved := false
SetFormat, float, 03
GetKeyState, joyu, 1JoyX
GetKeyState, joyr, 1JoyY
if joyu > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaU := joyu - JoyThresholdUpper
}
else if joyu < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaU := joyu - JoyThresholdLower
}
else
    DeltaU = 0
if joyr > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaR := joyr - JoyThresholdUpper
}
else if joyr < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaR := joyr - JoyThresholdLower
}
else
    DeltaR = 0

if MouseNeedsToBeMoved
{
        SetMouseDelay, -1  ; Makes movement smoother 
        x := (DeltaU/30) * (ABS(DeltaU)/30) * JoyMultiplier
        y := (DeltaR/30) * (ABS(DeltaR)/30) * JoyMultiplier 
        DllCall("mouse_event", uint, 1, int, x, int, y, uint, 0, int, 0)
}
return

Может кто подскажет - нельзя ли таким образом отправлять в неактивное окно перемещения мыши?

40

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Нужна помощь, а то уже голову сломал. Не могу назначить кнопки на отклонения стиков. Вернее в моих предыдущих постах я назначал кнопки на отклонение (вверх или вниз), но нужно как бы часовое отклонение например вверх - 1, вверх и вправо - 2, вправо - 3 и т.д. подскажите как сделать проверку для такого варианта... Не могу ничего нагуглить.

41

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Прошу прощения, вроде нашел ответ на свой вопрос.

#Persistent
SetTimer, WatchAxisSecondJoy, 10

WatchAxisSecondJoy:
GetKeyState, 1JoyU, 1JoyU
GetKeyState, 1JoyR, 1JoyR
SecondJoyPrev = %SecondJoy%

if 1JoyU < 20
    {
    if 1JoyR between 6 and 20
    SecondJoy = 8
    else if 1JoyR between 80 and 94
    SecondJoy = 6
    else SecondJoy =
    }
else if 1JoyU between 30 and 60
    {
    if 1JoyR < 5
    SecondJoy = 1
    else if 1JoyR > 95
    SecondJoy = 5
    else SecondJoy =     
    }
else SecondJoy =

if SecondJoy = %SecondJoyPrev%
    return

SetKeyDelay -1
if SecondJoy
{
    SendMessage, 0x06, 1,,, WoT Client        
    ControlSend,, {%SecondJoy% down}, WoT Client
}
if SecondJoyPrev
{
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%SecondJoyPrev% up}, WoT Client
}
return

Скрипт отправляет в неактивное окно игры правильно отклонения

42 (изменено: kharlashkin, 2014-06-26 11:53:12)

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Итак выкладываю здесь свой, так сказать, окончательный скрипт для игры в танчики двумя геймпадами. Может конечно что-то со временем и придумается с отправкой перемещений мыши в неактивное окно, но надежды мало.

+ открыть спойлер
JoyMultiplier = 5
JoyThreshold = 5
JoyThresholdUpper := 50 + JoyThreshold
JoyThresholdLower := 50 - JoyThreshold
#Persistent
SetTimer, WatchAxisFirstJoyMoveForwardAndZoom, 10
SetTimer, WatchAxisFirstJoyMoveRotate, 10
SetTimer, WatchAxisFirstJoyCameraRotateVert, 10
SetTimer, WatchAxisFirstJoyCameraRotateHoriz, 10
SetTimer, WatchAxisFirstJoyShoot, 10
SetTimer, WatchFirstJoyPOV, 10
SetTimer, WatchAxisSecondJoyMoveForwardAndZoom, 10
SetTimer, WatchAxisSecondJoyMoveRotate, 10
SetTimer, WatchAxisSecondJoyCameraRotate, 10
SetTimer, WatchAxisSecondJoyShoot, 10
SetTimer, WatchSecondJoyPOV, 10
return


;;;;;;;;;;;;первый геймпад движение вперед/назад в неактивном окне и зум

WatchAxisFirstJoyMoveForwardAndZoom:
GetKeyState, 1JoyY, 1JoyY
GetKeyState, 1JoyZ, 1JoyZ
GetKeyState, 1Joy2, 1Joy2
GetKeyState, 1Joy3, 1Joy3
FirstJoyMoveForwardAndZoomPrev = %FirstJoyMoveForwardAndZoom%

if 1Joy2 = D
    GoSub, FirstJoyConsumables
else if 1Joy3 = D
    GoSub, FirstJoyConsumables
else 
{
if 1JoyZ > 70
    {
    if 1JoyY < 30
        FirstJoyMoveForwardAndZoom = PgDn
    else if 1JoyY > 70
        FirstJoyMoveForwardAndZoom = PgUp
    else
        FirstJoyMoveForwardAndZoom =
    }
else if 1JoyY < 30
    FirstJoyMoveForwardAndZoom = vk57
else if 1JoyY > 70 
    FirstJoyMoveForwardAndZoom = vk53
else
    FirstJoyMoveForwardAndZoom =
}

if FirstJoyMoveForwardAndZoom = %FirstJoyMoveForwardAndZoomPrev%
    return

SetKeyDelay -1
if FirstJoyMoveForwardAndZoom
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyMoveForwardAndZoom% down}, WoT Client
    }
}
if FirstJoyMoveForwardAndZoomPrev
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyMoveForwardAndZoomPrev% up}, WoT Client
    }
}
return

;;;;;;;;;;;;первый геймпад движение влево/вправо в неактивном окне

WatchAxisFirstJoyMoveRotate:
GetKeyState, 1JoyX, 1JoyX
GetKeyState, 1Joy2, 1Joy2
GetKeyState, 1Joy3, 1Joy3
FirstJoyMoveRotatePrev = %FirstJoyMoveRotate%

if 1Joy2 = D
    GoSub, SecondJoyConsumables
else if 1Joy3 = D
    GoSub, SecondJoyConsumables
else
{
if 1JoyX > 80
    FirstJoyMoveRotate = vk44
else if 1JoyX < 20
    FirstJoyMoveRotate = vk41
else
    FirstJoyMoveRotate =
}

if FirstJoyMoveRotate = %FirstJoyMoveRotatePrev%
    return

SetKeyDelay -1
if FirstJoyMoveRotate
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyMoveRotate% down}, WoT Client
    }
}
if FirstJoyMoveRotatePrev
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyMoveRotatePrev% up}, WoT Client
    }
}
return

;;;;;;;;;;;;первый геймпад меню расходников в неактивном окне

FirstJoyConsumables:
FirstJoyConsumablesPrev = %FirstJoyConsumables%

if 1JoyX < 20
    {
    if 1JoyY < 20
    FirstJoyConsumables = vk38
    else if 1JoyY between 40 and 60
    FirstJoyConsumables = vk37
    else if 1JoyY > 80
    FirstJoyConsumables = vk36
    else FirstJoyConsumables =
    }
else if 1JoyX between 40 and 60
    {
    if 1JoyY < 10
    FirstJoyConsumables = vk31
    else if 1JoyY > 90
    FirstJoyConsumables = vk35
    else FirstJoyConsumables =     
    }
else if 1JoyX > 80
    {
    if 1JoyY < 20
    FirstJoyConsumables = vk32
    else if 1JoyY between 40 and 60
    FirstJoyConsumables = vk33
    else if 1JoyY > 80
    FirstJoyConsumables = vk34
    else FirstJoyConsumables =
    }
else FirstJoyConsumables =

if FirstJoyConsumables = %SFirstJoyConsumablesPrev%
return

SetKeyDelay -1
if FirstJoyConsumables
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyConsumables% down}, WoT Client
    } 
}
if FirstJoyConsumablesPrev
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyConsumablesPrev% up}, WoT Client
    } 
}
return

;;;;;;;;;;;;первый геймпад обзор влево/вправо в неактивном окне

WatchAxisFirstJoyCameraRotateVert:
GetKeyState, 1JoyU, 1JoyU
GetKeyState, 1Joy5, 1Joy5
FirstJoyCameraRotateVertPrev = %FirstJoyCameraRotateVert%

if 1Joy5 = D
    GoSub, FirstJoyCommandMenu
else
{
if 1JoyU > 70
    FirstJoyCameraRotateVert = Right
else if 1JoyU < 30
    FirstJoyCameraRotateVert = Left
else
    FirstJoyCameraRotateVert =
}

if FirstJoyCameraRotateVert = %FirstJoyCameraRotateVertPrev%
    return

SetKeyDelay -1
if FirstJoyCameraRotateVert
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyCameraRotateVert% down}, WoT Client
    }
}
if FirstJoyCameraRotateVertPrev
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyCameraRotateVertPrev% up}, WoT Client
    }
}
return

;;;;;;;;;;;;первый геймпад обзор вверх/вниз в неактивном окне

WatchAxisFirstJoyCameraRotateHoriz:
GetKeyState, 1JoyR, 1JoyR
GetKeyState, 1Joy5, 1Joy5
FirstJoyCameraRotateHorizPrev = %FirstJoyCameraRotateHoriz%

if 1Joy5 = D
    GoSub, FirstJoyCommandMenu
else
{
if 1JoyR > 70
    FirstJoyCameraRotateHoriz = Down
else if 1JoyR < 30
    FirstJoyCameraRotateHoriz = Up
else
    FirstJoyCameraRotateHoriz =
}

if FirstJoyCameraRotateHoriz = %FirstJoyCameraRotateHorizPrev%
    return

SetKeyDelay -1
if FirstJoyCameraRotateHoriz
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyCameraRotateHoriz% down}, WoT Client
    }
}
if FirstJoyCameraRotateHorizPrev
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyCameraRotateHorizPrev% up}, WoT Client
    }
}
return

;;;;;;;;;;;;первый геймпад меню приказов

FirstJoyCommandMenu:
FirstJoyCommandMenuPrev = %FirstJoyCommandMenu%

if 1JoyU < 20
    {
    if 1JoyR < 20
    FirstJoyCommandMenu = Numpad8
    else if 1JoyR between 40 and 60
    FirstJoyCommandMenu = Numpad7
    else if 1JoyR > 80
    FirstJoyCommandMenu = Numpad6
    else FirstJoyCommandMenu =
    }
else if 1JoyU between 40 and 60
    {
    if 1JoyR < 10
    FirstJoyCommandMenu = vk54
    else if 1JoyR > 90
    FirstJoyCommandMenu = Numpad5
    else FirstJoyCommandMenu =     
    }
else if 1JoyU > 80
    {
    if 1JoyR < 20
    FirstJoyCommandMenu = Numpad2
    else if 1JoyR between 40 and 60
    FirstJoyCommandMenu = Numpad3
    else if 1JoyR > 80
    FirstJoyCommandMenu = Numpad4
    else FirstJoyCommandMenu =
    }
else FirstJoyCommandMenu =

if FirstJoyCommandMenu = %FirstJoyCommandMenuPrev%
return

SetKeyDelay -1
if FirstJoyCommandMenu
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyCommandMenu% down}, WoT Client
    } 
}
if FirstJoyCommandMenuPrev
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyCommandMenuPrev% up}, WoT Client
    } 
}
return

;;;;;;;;;;;;первый геймпад выстрел в неактивном окне

WatchAxisFirstJoyShoot:
GetKeyState, 1JoyZ, 1JoyZ
FirstJoyShootPrev = %FirstJoyShoot%

if 1JoyZ < 30
    FirstJoyShoot = LButton
else
    FirstJoyShoot =

if FirstJoyShoot = %FirstJoyShootPrev%
    return

SetKeyDelay -1
if FirstJoyShoot
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x201,,,, WoT Client
    }
}
if FirstJoyShootPrev
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x202,,,, WoT Client
    }
}
return

;;;;;;;;;;;;;первый геймпад крестовина в неактивном окне

WatchFirstJoyPOV:
GetKeyState, 1JoyPOV, 1JoyPOV
FirstJoyPOVPrev = %FirstJoyPOV%

 if 1JoyPOV = 0
    FirstJoyPOV = vk52
else if 1JoyPOV = 18000
    FirstJoyPOV = vk46
else if 1JoyPOV = 27000
    FirstJoyPOV = vk58
else if 1JoyPOV = 9000
    FirstJoyPOV = vk43
else FirstJoyPOV = 

if FirstJoyPOV = %FirstJoyPOVPrev%
return

SetKeyDelay -1
if FirstJoyPOV
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyPOV% down}, WoT Client
    }
}
if FirstJoyPOVPrev
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {%FirstJoyPOVprev% up}, WoT Client
    }
}
return

;;;;;;;;;;;;первый геймпад LShift в неактивном окне

1Joy10::
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vkA0 Down}, WoT Client
    KeyWait, 1Joy10
    ControlSend,, {vkA0 Up}, WoT Client
    }
}
return

;;;;;;;;;;;;первый геймпад Space в неактивном окне

1Joy9::
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk20 Down}, WoT Client
    KeyWait, 1Joy9
    ControlSend,, {vk20 Up}, WoT Client
    }
}
return

;;;;;;;;;;;;первый геймпад выбор снарядов в неактивном окне

1Joy1::
Gosub, FirstSubToggle
Return

FirstSubToggle:
FirstToggle++
If FirstToggle = 1
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk31 down}, WoT Client
    Sleep, 10
    ControlSend,, {vk31 up}, WoT Client
    Sleep, 10
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk31 down}, WoT Client
    Sleep, 10
    ControlSend,, {vk31 up}, WoT Client    
    }
}
If FirstToggle = 2
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk32 down}, WoT Client
    Sleep, 10
    ControlSend,, {vk32 up}, WoT Client
    Sleep, 10
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk32 down}, WoT Client
    Sleep, 10
    ControlSend,, {vk32 up}, WoT Client    
    }
}
If FirstToggle = 3
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk33 down}, WoT Client
    Sleep, 10
    ControlSend,, {vk33 up}, WoT Client
    Sleep, 10
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk33 down}, WoT Client
    Sleep, 10
    ControlSend,, {vk33 up}, WoT Client    
    }
FirstToggle = 0
}
return

;;;;;;;;;;;;первый геймпад огнетушитель в неактивном окне

1Joy4::
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk35 Down}, WoT Client
    KeyWait, 1Joy4
    ControlSend,, {vk35 Up}, WoT Client
    }
}
return

;;;;;;;;;;;;первый геймпад автоприцел в неактивном окне

1Joy6::
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x204, 1,,, WoT Client
    KeyWait, 1Joy6
    SendMessage, 0x205, 1,,, WoT Client
    }
}
return

;;;;;;;;;;;;первый геймпад меню в неактивном окне

1Joy8::
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk1B Down}, WoT Client
    KeyWait, 1Joy8
    ControlSend,, {vk1B Up}, WoT Client
    }
}
return

;;;;;;;;;;;;первый геймпад скрыть мини карту в неактивном окне

1Joy7::
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk4D Down}, WoT Client
    KeyWait, 1Joy7
    ControlSend,, {vk4D Up}, WoT Client
    }
}
return

;;;;;;;;;;;;первый геймпад ремонт в неактивном окне

1Joy3::
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk34 Down}, WoT Client
    KeyWait, 1Joy3
    ControlSend,, {vk34 Up}, WoT Client
    }   
}
return

;;;;;;;;;;;;первый геймпад лечение в неактивном окне

1Joy2::
{
IfWinNotActive, WoT Client
    {
    SendMessage, 0x06, 1,,, WoT Client
    ControlSend,, {vk36 Down}, WoT Client
    KeyWait, 1Joy2
    ControlSend,, {vk36 Up}, WoT Client
    }    
}
return

;;;;;;;;;;;;второй геймпад

;;;;;;;;;;;;второй геймпад движение вперед/назад в активном окне и зум

WatchAxisSecondJoyMoveForwardAndZoom:
GetKeyState, 2JoyY, 2JoyY
GetKeyState, 2JoyZ, 2JoyZ
GetKeyState, 2Joy2, 2Joy2
GetKeyState, 2Joy3, 2Joy3
SecondJoyMoveForwardAndZoomPrev = %SecondJoyMoveForwardAndZoom%

if 2Joy2 = D
    GoSub, SecondJoyConsumables
else if 2Joy3 = D
    GoSub, SecondJoyConsumables
else 
{
if 2JoyZ > 70
    {
    if 2JoyY < 30
        SecondJoyMoveForwardAndZoom = PgDn
    else if 2JoyY > 70
        SecondJoyMoveForwardAndZoom = PgUp
    else
        SecondJoyMoveForwardAndZoom =
    }
else if 2JoyY < 30
    SecondJoyMoveForwardAndZoom = vk57
else if 2JoyY > 70 
    SecondJoyMoveForwardAndZoom = vk53
else
    SecondJoyMoveForwardAndZoom =
}

if SecondJoyMoveForwardAndZoom = %SecondJoyMoveForwardAndZoomPrev%
    return

SetKeyDelay -1
if SecondJoyMoveForwardAndZoom
{
    ControlSend,, {%SecondJoyMoveForwardAndZoom% down}, [#] WoT Client [#]
}
if SecondJoyMoveForwardAndZoomPrev
{
    ControlSend,, {%SecondJoyMoveForwardAndZoomPrev% up}, [#] WoT Client [#]
}
return

;;;;;;;;;;;;второй геймпад движение влево/вправо в активном окне

WatchAxisSecondJoyMoveRotate:
GetKeyState, 2JoyX, 2JoyX
GetKeyState, 2Joy2, 2Joy2
GetKeyState, 2Joy3, 2Joy3
SecondJoyMoveRotatePrev = %SecondJoyMoveRotate%

if 2Joy2 = D
    GoSub, SecondJoyConsumables
else if 2Joy3 = D
    GoSub, SecondJoyConsumables
else
{
if 2JoyX > 80
    SecondJoyMoveRotate = vk44
else if 2JoyX < 20
    SecondJoyMoveRotate = vk41
else
    SecondJoyMoveRotate =
}

if SecondJoyMoveRotate = %SecondJoyMoveRotatePrev%
    return

SetKeyDelay -1
if SecondJoyMoveRotate
{
    ControlSend,, {%SecondJoyMoveRotate% down}, [#] WoT Client [#]
}
if SecondJoyMoveRotatePrev
{
    ControlSend,, {%SecondJoyMoveRotatePrev% up}, [#] WoT Client [#]
}
return

;;;;;;;;;;;;второй геймпад меню расходников

SecondJoyConsumables:
SecondJoyConsumablesPrev = %SecondJoyConsumables%

if 2JoyX < 20
    {
    if 2JoyY < 20
    SecondJoyConsumables = vk38
    else if 2JoyY between 40 and 60
    SecondJoyConsumables = vk37
    else if 2JoyY > 80
    SecondJoyConsumables = vk36
    else SecondJoyConsumables =
    }
else if 2JoyX between 40 and 60
    {
    if 2JoyY < 10
    SecondJoyConsumables = vk31
    else if 2JoyY > 90
    SecondJoyConsumables = vk35
    else SecondJoyConsumables =     
    }
else if 2JoyX > 80
    {
    if 2JoyY < 20
    SecondJoyConsumables = vk32
    else if 2JoyY between 40 and 60
    SecondJoyConsumables = vk33
    else if 2JoyY > 80
    SecondJoyConsumables = vk34
    else SecondJoyConsumables =
    }
else SecondJoyConsumables =

if SecondJoyConsumables = %SecondJoyConsumablesPrev%
return

SetKeyDelay -1
if SecondJoyConsumables
{
    ControlSend,, {%SecondJoyConsumables% down}, [#] WoT Client [#]
}
if SecondJoyConsumablesPrev
{
    ControlSend,, {%SecondJoyConsumablesPrev% up}, [#] WoT Client [#] 
}
return

;;;;;;;;;;;;второй геймпад обзор и мышь в активном окне

WatchAxisSecondJoyCameraRotate:
MouseNeedsToBeMoved := false
SetFormat, float, 03
GetKeyState, 2JoyU, 2JoyU
GetKeyState, 2JoyR, 2JoyR
GetKeyState, 2Joy5, 2Joy5

if 2Joy5 = D
    GoSub, SecondJoyCommandMenu
else if 2Joy5 = U
{
if 2JoyU > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaU := 2JoyU - JoyThresholdUpper
}
else if 2JoyU < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaU := 2JoyU - JoyThresholdLower
}
else
    DeltaU = 0
if 2JoyR > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaR := 2JoyR - JoyThresholdUpper
}
else if 2JoyR < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaR := 2JoyR - JoyThresholdLower
}
else
    DeltaR = 0
}

SetKeyDelay -1
if MouseNeedsToBeMoved
{
        SetMouseDelay, -1  ; Makes movement smoother 
    x := (DeltaU/30) * (ABS(DeltaU)/30) * JoyMultiplier
        y := (DeltaR/30) * (ABS(DeltaR)/30) * JoyMultiplier 
        DllCall("mouse_event", uint, 1, int, x, int, y, uint, 0, int, 0)
}
return

;;;;;;;;;;;;второй геймпад меню приказов

SecondJoyCommandMenu:
SecondJoyCommandMenuPrev = %SecondJoyCommandMenu%

if 2JoyU < 20
    {
    if 2JoyR < 20
    SecondJoyCommandMenu = Numpad8
    else if 2JoyR between 40 and 60
    SecondJoyCommandMenu = Numpad7
    else if 2JoyR > 80
    SecondJoyCommandMenu = Numpad6
    else SecondJoyCommandMenu =
    }
else if 2JoyU between 40 and 60
    {
    if 2JoyR < 10
    SecondJoyCommandMenu = vk54
    else if 2JoyR > 90
    SecondJoyCommandMenu = Numpad5
    else SecondJoyCommandMenu =     
    }
else if 2JoyU > 80
    {
    if 2JoyR < 20
    SecondJoyCommandMenu = Numpad2
    else if 2JoyR between 40 and 60
    SecondJoyCommandMenu = Numpad3
    else if 2JoyR > 80
    SecondJoyCommandMenu = Numpad4
    else SecondJoyCommandMenu =
    }
else SecondJoyCommandMenu =

if SecondJoyCommandMenu = %SecondJoyCommandMenuPrev%
return

SetKeyDelay -1
if SecondJoyCommandMenu
{
    ControlSend,, {%SecondJoyCommandMenu% down}, [#] WoT Client [#]
}
if SecondJoyCommandMenuPrev
{
    ControlSend,, {%SecondJoyCommandMenuPrev% up}, [#] WoT Client [#] 
}
return

;;;;;;;;;;;;второй геймпад выстрел в активном окне

WatchAxisSecondJoyShoot:
GetKeyState, 2JoyZ, 2JoyZ
SecondJoyShootPrev = %SecondJoyShoot%

if 2JoyZ < 30
    SecondJoyShoot = LButton
else
    SecondJoyShoot =

if SecondJoyShoot = %SecondJoyShootPrev%
    return

SetKeyDelay -1
if SecondJoyShoot
{
    Send, {%SecondJoyShoot% down} 
}
if SecondJoyShootPrev
{
    Send, {%SecondJoyShootPrev% up} 
}
return

;;;;;;;;;;;;;второй геймпад крестовина в активном окне

WatchSecondJoyPOV:
GetKeyState, 2JoyPOV, 2JoyPOV
SecondJoyPOVPrev = %SecondJoyPOV%

if 2JoyPOV = 0
    SecondJoyPOV = vk52
else if 2JoyPOV = 18000
    SecondJoyPOV = vk46
else if 2JoyPOV = 27000
    SecondJoyPOV = vk58
else if 2JoyPOV = 9000
    SecondJoyPOV = vk43
else SecondJoyPOV = 

if SecondJoyPOV = %SecondJoyPOVPrev%
return

SetKeyDelay -1
if SecondJoyPOV
{
    ControlSend,, {%SecondJoyPOV% down}, [#] WoT Client [#]
}
if SecondJoyPOVPrev
{
    ControlSend,, {%SecondJoyPOVprev% up}, [#] WoT Client [#]
}
return

;;;;;;;;;;;;второй геймпад LShift в активном окне

2Joy10::
{
    ControlSend,, {vkA0 Down}, [#] WoT Client [#]
    KeyWait, 2Joy10
    ControlSend,, {vkA0 Up}, [#] WoT Client [#]
}
return

;;;;;;;;;;;;второй геймпад Space в активном окне

2Joy9::
{
    ControlSend,, {vk20 Down}, [#] WoT Client [#]
    KeyWait, 2Joy9
    ControlSend,, {vk20 Up}, [#] WoT Client [#]
}
return

;;;;;;;;;;;;второй геймпад выбор снарядов в неактивном окне

2Joy1::
Gosub, SecondSubToggle
Return

SecondSubToggle:
SecondToggle++
If SecondToggle = 1
{
    ControlSend,, {vk31 down}, [#] WoT Client [#]
    Sleep, 10
    ControlSend,, {vk31 up}, [#] WoT Client [#]
    Sleep, 10
    ControlSend,, {vk31 down}, [#] WoT Client [#]
    Sleep, 10
    ControlSend,, {vk31 up}, [#] WoT Client [#]
}
If SecondToggle = 2
{
    ControlSend,, {vk32 down}, [#] WoT Client [#]
    Sleep, 10
    ControlSend,, {vk32 up}, [#] WoT Client [#]
    Sleep, 10
    ControlSend,, {vk32 down}, [#] WoT Client [#] 
    Sleep, 10
    ControlSend,, {vk32 up}, [#] WoT Client [#]
}
If SecondToggle = 3
{
    ControlSend,, {vk33 down}, [#] WoT Client [#]
    Sleep, 10
    ControlSend,, {vk33 up}, [#] WoT Client [#]
    Sleep, 10
    ControlSend,, {vk33 down}, [#] WoT Client [#]
    Sleep, 10
    ControlSend,, {vk33 up}, [#] WoT Client [#]
    SecondToggle = 0
}
return

;;;;;;;;;;;;второй геймпад огнетушитель в активном окне

2Joy4::
{
    ControlSend,, {vk35 Down}, [#] WoT Client [#]
    KeyWait, 2Joy4
    ControlSend,, {vk35 Up}, W[#] WoT Client [#]
}
return

;;;;;;;;;;;;второй геймпад автоприцел в активном окне

2Joy6::
{
    Send, {RButton Down}
    KeyWait, 2Joy6
    Send, {RButton up}
}
return

;;;;;;;;;;;;второй геймпад меню в неактивном окне

2Joy8::
{
    ControlSend,, {vk1B Down}, [#] WoT Client [#]
    KeyWait, 2Joy8
    ControlSend,, {vk1B Up}, [#] WoT Client [#]
}
return

;;;;;;;;;;;;второй геймпад скрыть мини карту в активном окне

2Joy7::
{
    ControlSend,, {vk4D Down}, [#] WoT Client [#]
    KeyWait, 2Joy7
    ControlSend,, {vk4D Up}, [#] WoT Client [#]    
}
return

;;;;;;;;;;;;второй геймпад скрыть мини карту в активном окне

2Joy5::
{
    ControlSend,, {vk5A Down}, [#] WoT Client [#]
    KeyWait, 2Joy5
    ControlSend,, {vk5A Up}, [#] WoT Client [#]    
}
return

;;;;;;;;;;;;второй геймпад ремонт

2Joy3::
{
    ControlSend,, {vk34 Down}, [#] WoT Client [#]
    KeyWait, 2Joy3
    ControlSend,, {vk34 Up}, [#] WoT Client [#]   
}
return

;;;;;;;;;;;;второй геймпад лечение

2Joy2::
{
    ControlSend,, {vk36 Down}, [#] WoT Client [#]
    KeyWait, 2Joy2
    ControlSend,, {vk36 Up}, [#] WoT Client [#]    
}
return

43 (изменено: kharlashkin, 2014-06-26 11:54:38)

Re: Отправка нажатий клавиш в неактивное окно World of Tanks

Меню приказов, лечения экипажа и ремонт модулей.