1 (изменено: kharlashkin, 2014-12-27 12:01:28)

Тема: Перемещения мыши в игре геймпадом [Решено]

Доброе время суток!

Использую AHK как эмулятор клавиатуры/мыши геймпадом, собственно код которым я пользуюсь для перемещений мыши:


JoyMultiplier = 12
JoyThreshold = 5
JoyThresholdUpper := 50 + JoyThreshold
JoyThresholdLower := 50 - JoyThreshold
#Persistent
SetTimer, WatchAxisFirstJoyCameraRotate, 5

WatchAxisFirstJoyCameraRotate:
MouseNeedsToBeMoved := false
SetFormat, float, 05
GetKeyState, 1JoyU, 1JoyU
GetKeyState, 1JoyR, 1JoyR

if 1JoyU > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaU := 1JoyU - JoyThresholdUpper
}
else if 1JoyU < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaU := 1JoyU - JoyThresholdLower
}
else
    DeltaU = 0
if 1JoyR > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaR := 1JoyR - JoyThresholdUpper
}
else if 1JoyR < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaR := 1JoyR - JoyThresholdLower
}
else
    DeltaR = 0

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

В игре выявил одну проблему - нет медленного перемещения мыши. Как бы мышь двигается когда значения x/y переваливают за 1 и тогда камера в игре сразу перемещается на 20-50 пикселей (линейкой не мерял - данные на глазок). Т.е. на дальних/средних дистанциях тяжело прицеливаться.

Специально взял другой эмулятор и подсмотрел как там это решается. Может я и не прав, но логически правильно - при минимальных отклонениях стика значения x/y суммируются и когда выходят за известное кол-во циклов за единицу (в зависимости от степени отклонения), только тогда отправляется перемещение мыши на 1 пиксель.

Подскажите, уважаемые, где можно подсмотреть подобную реализацию сложения?

2 (изменено: kharlashkin, 2014-12-19 12:30:30)

Re: Перемещения мыши в игре геймпадом [Решено]

Подумал-погадал, наваял вот это:

SetKeyDelay -1
if MouseNeedsToBeMoved
{
SetMouseDelay, -1
prevx := (DeltaU/45) * (ABS(DeltaU)/45) * JoyMultiplier
    if prevx < 1
        {
        interx := nextx + prevx
        if interx < 1
            nextx := interx
        else x := interx
            nextx = 0
        }
    else x:= prevx
prevy := (DeltaR/45) * (ABS(DeltaR)/45) * JoyMultiplier
    if prevy < 1
        {
        intery := nexty + prevy
        if intery < 1
            nexty := intery
        else y := intery
            nexty = 0
        }
    else y:= prevy
DllCall("mouse_event", uint, 1, int, x, int, y, uint, 0, int, 0)
}
return

Кто как думает заработает?

3

Re: Перемещения мыши в игре геймпадом [Решено]

Протестировал скрипт, вот такой вид правильный:

SetKeyDelay -1
if MouseNeedsToBeMoved
{
SetMouseDelay, -1
prevx := (DeltaX/45) * (ABS(DeltaX)/45) * JoyMultiplier
    if prevx between -1 and 0
        {
        interx := nextx - prevx
        if interx between -1 and 0
            {
            nextx := interx
            }
        else 
            {
            x := interx
            nextx = 0
            }
        }    
    else if prevx between 0 and 1
        {
        interx := nextx + prevx
        if interx between 0 and 1
            {
            nextx := interx
            }
        else 
            {
            x := interx
            nextx = 0
            }
        }
    else x:= prevx
prevy := (DeltaY/45) * (ABS(DeltaY)/45) * JoyMultiplier
    if prevy between 0 and 1
        {
        intery := nexty + prevy
        if intery between 0 and 1
            {
            nexty := intery
            }
        else 
            {
            y := intery
            nexty = 0
            }
        }
    else if prevy between -1 and 0
        {
        intery := nexty - prevy
        if intery between -1 and 0
            {
            nexty := intery
            }
        else 
            {
            y := intery
            nexty = 0
            }
        }
    else y:= prevy
DllCall("mouse_event", uint, 1, int, x, int, y, uint, 0, int, 0)
}
return

Вроде работает как нужно "на глаз", но геймпад который под рукой - имеет большую погрешность около 11% (отклонение стиков AHK начинает принимать с 56-57 вместо положенных 51, со старой версией скрипта движение начиналось с 64-65 (что в соответсвует реальным расчетам (13/45)*(13/45)*12 = 1,00148, (14/45)*(14/45)*12 = 1,16148).
Вопрос в том что (5/45)*(5/45)*12 = 0,148 в 5 мс получается скорость 33,75 мс один пиксель. Дома буду тестировать с боле точным Xbox 360 геймпадом и в игре - посмотрю что получиться.

Обед пропал блин...

4 (изменено: kharlashkin, 2014-12-22 12:12:49)

Re: Перемещения мыши в игре геймпадом [Решено]

Не работает код, все выходные пробовал разные варианты. Мне кажется, что-то не так с форматом данных... Вот код просто рабочий

WatchAxisFirstJoyCameraRotate:
JoyMultiplier = 12
MouseNeedsToBeMoved := false
GetKeyState, 1JoyU, 1JoyU
GetKeyState, 1JoyR, 1JoyR

if 1JoyU > 50
    DeltaU := 1JoyU - 50
else if 1JoyU < 50
    DeltaU := 1JoyU - 50
else
    DeltaU = 0
if 1JoyR > 50
    DeltaR := 1JoyR - 50
else if 1JoyR < 50
    DeltaR := 1JoyR - 50
else
    DeltaR = 0
if SQRT(ABS(DeltaU**2)+ABS(DeltaR**2))>=1
    MouseNeedsToBeMoved := true

SetKeyDelay -1
if MouseNeedsToBeMoved
{
x := (DeltaU/40) * (ABS(DeltaU)/40) * JoyMultiplier
y := (DeltaR/40) * (ABS(DeltaR)/40) * JoyMultiplier
DllCall("mouse_event", uint, 1, int, x, int, y, uint, 0, int, 0)
}
return

В данном случае курсор начинает двигаться когда значения перемещений стика превышают "мертвую зону" в 12. Никакие пробы сложений значений при x или y < 1 не приводят к результату.

5 (изменено: Alectric, 2014-12-22 18:16:38)

Re: Перемещения мыши в игре геймпадом [Решено]

Посмотри тут, может найдешь что-нибудь полезное.

Или попробуй подправленный вариант:

#SingleInstance,Force
SetKeyDelay -1



loop
{
  sleep,10
  GetKeyState, 1JoyU, 1JoyU
  GetKeyState, 1JoyR, 1JoyR

  if 1JoyU > 60
  {
      DeltaU := 1JoyU - 50
      mult=1
  }
  else if 1JoyU < 40
  {
      DeltaU := 1JoyU - 50
      mult=1
  }
  else
      DeltaU=0

  if 1JoyR > 60
  {
      DeltaR := 1JoyR - 50
      mult=1
  }
  else if 1JoyR < 40
  {
      DeltaR := 1JoyR - 50
      mult=1
  }
  else
      DeltaR=0
if mult=1
{
  JoyMultiplier = 1
  multi+=0.1
  JoyMultiplier*=1+multi
  if JoyMultiplier>20      ; ограничение
    JoyMultiplier=20
;tooltip,%JoyMultiplier%`n%multi%`n%1JoyR%`n%DeltaU%
}

  if SQRT(ABS(DeltaU**2)+ABS(DeltaR**2))>=1
      MouseNeedsToBeMoved := true

  if !MouseNeedsToBeMoved
    mult:=multi:=0

  if MouseNeedsToBeMoved
  {
    x := (DeltaU/40) * (ABS(DeltaU)/40) * JoyMultiplier
    y := (DeltaR/40) * (ABS(DeltaR)/40) * JoyMultiplier
    DllCall("mouse_event", uint, 1, int, x, int, y, uint, 0, int, 0)
    MouseNeedsToBeMoved := false
  }
}
return

Или так:

#SingleInstance,Force
SetKeyDelay -1

deadzone=1      ; мертвая зона
JoyMultiplier=5   ; начальная скорость (чем меньше тем больше)
Multi=0.01    ; скорость нарастания скорости (поставь минус чтобы замедлять а не ускорять)

loop
{
  sleep,10
  JoyU:=GetKeyState("JoyU")-50
  JoyR:=GetKeyState("JoyR")-50
;tooltip,%JoyU%`n%JoyR%`n%mult%,0,0,2

  if !(JoyU>-deadzone and JoyU<deadzone and JoyR>-deadzone and JoyR<deadzone)
  {
    mult+=Multi
    if mult<0.1
      mult=0.1
    x := (JoyU/40) * ABS(JoyU/JoyMultiplier*Mult)
    y := (JoyR/40) * ABS(JoyR/JoyMultiplier*Mult)
    DllCall("mouse_event", uint, 1, int, x, int, y, uint, 0, int, 0)
  }
  else
    mult=1
}
return
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

6

Re: Перемещения мыши в игре геймпадом [Решено]

Гуглить то я умею Но не приходил в голову с этой стороны подойти к поиску, спасибо!

Код попробую тоже обязательно.

7

Re: Перемещения мыши в игре геймпадом [Решено]

Отчитаюсь:
1. Гугление ни к чему интересному не привело.
2. Спасибо за скрипты подтолкнули к 2-м очень правильным вещам: использовать вместо перемещений мыши ToolTip (чтобы не "на глазок" определять, а реальными данными) и операцию "+=". Используя документацию вот что получилось:

#Persistent
SetTimer, WatchAxisFirstJoyCameraRotate, 5

WatchAxisFirstJoyCameraRotate:
MouseNeedsToBeMoved := false
GetKeyState, 1Joy7, 1Joy7
GetKeyState, 1JoyR, 1JoyR
GetKeyState, 1JoyZ, 1JoyZ

if 1Joy7 = D
    JoyMultiplier = 15
else JoyMultiplier = 10

if 1JoyZ > 50
    DeltaZ := 1JoyZ - 50
else if 1JoyZ < 50
    DeltaZ := 1JoyZ - 50
else
    DeltaZ = 0

if 1JoyR > 50
    DeltaR := 1JoyR - 50
else if 1JoyR < 50
    DeltaR := 1JoyR - 50
else
    DeltaR = 0

if SQRT((ABS(DeltaZ)**2)+(ABS(DeltaR)**2)) >= 1
    MouseNeedsToBeMoved := true

SetKeyDelay -1
if MouseNeedsToBeMoved
{
IntX :=    (DeltaZ/60) * (ABS(DeltaZ)/60) * JoyMultiplier
IntY := (DeltaR/60) * (ABS(DeltaR)/60) * JoyMultiplier
x := 0
y := 0
if ABS(IntX) <= 1
    {
    PrevX += IntX
    if ABS(PrevX) >= 1
    {
    x := PrevX
    PrevX := 0
    }
    }
else 
    {
    x := IntX
    PrevX := 0
    }
if ABS(IntY) <= 1
    {
    PrevY += IntY
    if ABS(PrevY) >= 1
    {
    y := PrevY
    PrevY :=0
    }
    }
else 
    {
    y := IntY
    PrevY := 0
    }
DllCall("mouse_event", uint, 1, int, x, int, y, uint, 0, int, 0)
}
return

Разумеется вместо DllCall сначала был ToolTip, %x% %y% %IntX% %IntY% %PrevX% %PrevY%. Теперь вроде все работает как нужно.

8

Re: Перемещения мыши в игре геймпадом [Решено]

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

9 (изменено: Alectric, 2014-12-27 15:18:16)

Re: Перемещения мыши в игре геймпадом [Решено]

kharlashkin пишет:

GetKeyState, 1JoyR, 1JoyR
GetKeyState, 1JoyZ, 1JoyZ

if 1JoyZ > 50
    DeltaZ := 1JoyZ - 50
else if 1JoyZ < 50
    DeltaZ := 1JoyZ - 50
else
    DeltaZ = 0

if 1JoyR > 50
    DeltaR := 1JoyR - 50
else if 1JoyR < 50
    DeltaR := 1JoyR - 50
else
    DeltaR = 0

Этот код равноценен этому:


  DeltaZ:=GetKeyState("JoyZ")-50
  DeltaR:=GetKeyState("JoyR")-50

А в остальном все отлично.




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

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

#SingleInstance,Force
AutoTrim,Off
CoordMode,Mouse,Screen
CoordMode,ToolTip
Menu,Tray,UseErrorLevel
process,priority,,High
SendMode,Input
SetBatchLines,-1
SetControlDelay,0
SetFormat,float,6.0
SetKeyDelay,50
SetTitleMatchMode,2
SetWinDelay,-1
SetWorkingDir,%A_ScriptDir%
StringCaseSense,On


loop
{
  sleep,10
  GetKeyState,JoyY,JoyY
  if (Joyy<60 and chekY1="")  ; левый вниз
  {
    chekY1=1
    send,{Down up}
  }
  else if (Joyy>80 and chekY1=1)
  {
    chekY1=
    send,{Down down}
  }

  if (Joyy>40 and chekY2="")  ; левый вверх
  {
    chekY2=1
    send,{up up}
  }
  else if (Joyy<20 and chekY2=1)
  {
    chekY2=
    send,{up down}
  }

  GetKeyState,JoyX,JoyX
  if (Joyx<60 and chekX1="")  ; левый вправо
  {
    chekX1=1
    send,{right up}
  }
  else if (Joyx>80 and chekX1=1)
  {
    chekX1=
    send,{right down}
  }

  if (Joyx>40 and chekX2="")  ; левый влево
  {
    chekX2=1
    send,{left up}
  }
  else if (Joyx<20 and chekX2=1)
  {
    chekX2=
    send,{left down}
  }

  GetKeyState,JoyR,JoyR
  if (Joyr>40 and Joyr<60 and chekR="")  ; правый верх низ
  {
    chekR=1
    send,{numpad2 up}{numpad8 up}
  }
  else if (Joyr>80 and chekR=1)
  {
    chekR=
    send,{numpad2 down}
  }
  else if (Joyr<20 and chekR=1)
  {
    chekR=
    send,{numpad8 down}
  }

  GetKeyState,JoyZ,JoyZ
  if (Joyz>40 and Joyz<60 and chekZ="")  ; правый лево право
  {
    chekZ=1
    send,{numpad4 up}{numpad6 up}
  }
  else if (Joyz>80 and chekZ=1)
  {
    chekZ=
    send,{numpad6 down}
  }
  else if (Joyz<20 and chekZ=1)
  {
    chekZ=
    send,{numpad4 down}
  }


  if (!GetKeyState("Joy1") and Joy1=1)
  {
    Joy1=
    send {alt up}
  }
  if (!GetKeyState("Joy2") and Joy2=1)
  {
    Joy2=
    send {space up}
  }
  if (!GetKeyState("Joy3") and Joy3=1)
  {
    Joy3=
    send {ctrl up}
  }
;  else if GetKeyState("Joy3")
;  {
;    send {ctrl down}
;    sleep,50
;    send {ctrl up}
;  }
  if (!GetKeyState("Joy4") and Joy4=1)
  {
    Joy4=
    send {up up}
  }
  if (!GetKeyState("Joy5") and Joy5=1)
  {
    Joy5=
    send {shift up}
  }
  if (!GetKeyState("Joy6") and Joy6=1)
  {
    Joy6=
    send {vk5a up}
  }
  if (!GetKeyState("Joy7") and Joy7=1)
  {
    Joy7=
    send {f2 up}
  }
  if (!GetKeyState("Joy8") and Joy8=1)
  {
    Joy8=
    send {}
  }
  if (!GetKeyState("Joy9") and Joy9=1)
  {
    Joy9=
    send {esc up}
  }
  if (!GetKeyState("Joy10") and Joy10=1)
  {
    Joy10=
    send {enter up}
  }
  if (!GetKeyState("Joy11") and Joy11=1)
  {
    Joy11=
    send {}
  }
  if (!GetKeyState("Joy12") and Joy12=1)
  {
    Joy12=
    send {}
  }
}
return

joy1::
joy1=1
send,{alt down}
return

joy2::
joy2=1
send,{space down}
return

joy3::
joy3=1
send,{ctrl down}
return

joy4::
joy4=1
send,{up down}
return

joy5::
joy5=1
send,{shift down}
return

joy6::
joy6=1
send,{vk5a down}
return

joy7::
joy7=1
send,{f2 down}
return

joy8::
joy8=1
return

joy9::
joy9=1
send,{esc down}
return

joy10::
joy10=1
send,{enter down}
return

joy11::
joy11=1
return

joy12::
joy12=1
return

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

10 (изменено: kharlashkin, 2014-12-28 23:37:37)

Re: Перемещения мыши в игре геймпадом [Решено]

Alectric пишет:

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

Раз пошла такая пьянка, делюсь своим скриптом Делал для WoT под Xbox 360 геймпад, но, в принципе, можно переделать под любую другую игру и контроллер.

+ открыть спойлер
#Persistent
SetTimer, WatchAxisFirstJoyMoveForwardAndZoom, 10
SetTimer, WatchAxisFirstJoyMoveRotate, 10
SetTimer, WatchAxisFirstJoyCameraRotate, 5
SetTimer, TriggerStateFirstJoy, 10
SetTimer, FirstJoyShoot, 10
SetTimer, WatchFirstJoyPOV, 10
SetTimer, WatchWindow, 100
SetTimer, SplitScreen, 100
return

;;;;;;;;;;;;отслеживание нажатия триггеров

TriggerStateFirstJoy:
XInput_Init()
    Loop, 4 {
        if State := XInput_GetState(A_Index-1) {
            LT := State.bLeftTrigger
            RT := State.bRightTrigger
        }
    }
if (LT = 1 and RT = 1)
AVAR = 7
if (LT = 0 and RT = 0)
AVAR = 1
if (LT = 1 and RT = 0)
AVAR = 5
if (LT = 0 and RT = 1)
AVAR = 9
return

;;;;;;;;;;;;плавное движение вперед/назад и зум

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

if 1Joy2 = D
    GoSub, FirstJoyConsumables
if 1Joy3 = D 
    GoSub, FirstJoyConsumables
else if LT > 64
    {
    GoSub, FirstJoyZoomCoef
    if 1JoyY < 30
        FirstJoyMoveForwardAndZoom = PgDn
    else if 1JoyY > 70
        FirstJoyMoveForwardAndZoom = PgUp
    else
        FirstJoyMoveForwardAndZoom =
    }
else if 1JoyY < 5
    FirstJoyMoveForwardAndZoom = vk55
else if 1JoyY between 6 and 15
    FirstJoyMoveForwardAndZoom = vk59
else if 1JoyY between 16 and 25
    FirstJoyMoveForwardAndZoom = vk48
else if 1JoyY between 75 and 89
    FirstJoyMoveForwardAndZoom = vk4E
else if 1JoyY > 90
    FirstJoyMoveForwardAndZoom = vk4A
else
    FirstJoyMoveForwardAndZoom =

if FirstJoyMoveForwardAndZoom = %FirstJoyMoveForwardAndZoomPrev%
return

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

;;;;;;;;;;;;движение влево/вправо

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

if 1Joy2 = D
    GoSub, FirstJoyConsumables
if 1Joy3 = D
    GoSub, FirstJoyConsumables
else
if 1JoyX > 75
    FirstJoyMoveRotate = vk44
else if 1JoyX < 25
    FirstJoyMoveRotate = vk41
else
    FirstJoyMoveRotate =

if FirstJoyMoveRotate = %FirstJoyMoveRotatePrev%
return

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

;;;;;;;;;;;;геймпад зум коэфициент

FirstJoyZoomCoef:
GetKeyState, 1JoyY, 1JoyY
FirstJoyZoomCoefPrev = %FirstJoyZoomCoef%

if 1JoyY < 6
    FirstJoyZoomCoef = NumpadDiv
else if 1JoyY between 7 and 12
    FirstJoyZoomCoef = NumpadMult
else if 1JoyY between 13 and 18
    FirstJoyZoomCoef = NumpadSub
else if 1JoyY between 19 and 24
    FirstJoyZoomCoef = NumpadAdd
else if 1JoyY between 25 and 30
    FirstJoyZoomCoef = NumpadDot
else if 1JoyY between 70 and 75
    FirstJoyZoomCoef = NumpadDot
else if 1JoyY between 76 and 81
    FirstJoyZoomCoef = NumpadAdd
else if 1JoyY between 82 and 87
    FirstJoyZoomCoef = NumpadSub
else if 1JoyY between 88 and 93
    FirstJoyZoomCoef = NumpadMult
else if 1JoyY > 94
    FirstJoyZoomCoef = NumpadDiv
else
    FirstJoyZoomCoef =

if FirstJoyZoomCoef = %FirstJoyZoomCoefPrev%
    return

SetKeyDelay -1
if FirstJoyZoomCoefPrev
{
    ControlSend,, {%FirstJoyZoomCoefPrev% up}, WoT Client
}
if FirstJoyZoomCoef
{
    ControlSend,, {%FirstJoyZoomCoef% down}, 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 = %FirstJoyConsumablesPrev%
return

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

;;;;;;;;;;;;обзор и мышь


WatchAxisFirstJoyCameraRotate:
GetKeyState, 1JoyU, 1JoyU
GetKeyState, 1JoyR, 1JoyR

if 1JoyU > 50
    DeltaU := 1JoyU - 50
else if 1JoyU < 50
    DeltaU := 1JoyU - 50
else
    DeltaU = 0
if 1JoyR > 50
    DeltaR := 1JoyR - 50
else if 1JoyR < 50
    DeltaR := 1JoyR - 50
else
    DeltaR = 0
if SQRT((ABS(DeltaU)**2)+(ABS(DeltaR)**2)) >= 13
    MouseNeedsToBeMoved := true

SetKeyDelay -1
if MouseNeedsToBeMoved
{
IntX := (DeltaU/60) * (ABS(DeltaU)/60) * (7 + (LT / 35))
IntY := (DeltaR/60) * (ABS(DeltaR)/60) * (7 + (LT / 35))
x := 0
y := 0
if ABS(IntX) <= 1
    {
    PrevX += IntX
    if ABS(PrevX) >= 1
        {
        x := PrevX
        PrevX := 0
        }
    }
else 
    {
    x := IntX
    PrevX := 0
    }
if ABS(IntY) <= 1
    {
    PrevY += IntY
    if ABS(PrevY) >= 1
        {
        y := PrevY
        PrevY :=0
        }
    }
else 
    {
    y := IntY
    PrevY := 0
    }
DllCall("mouse_event", uint, 1, int, x, int, y, uint, 0, int, 0)
}
return

;;;;;;;;;;;;выстрел/левая кнопка мыши

FirstJoyShoot:
FirstJoyShootPrev = %FirstJoyShoot%

if RT > 64
    FirstJoyShoot = LButton
else
    FirstJoyShoot =

if FirstJoyShoot = %FirstJoyShootPrev%
    return

SetKeyDelay -1
if FirstJoyShootPrev
{
    Send, {%FirstJoyShootPrev% up} 
}
if FirstJoyShoot
{
    Send, {%FirstJoyShoot% down} 
}
return

;;;;;;;;;;;;;крестовина полный вперед/полный назад/фиксация корпуса/перезарядка кассеты

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

if LT > 64
    {
    if 1JoyPOV = 0
        FirstJoyPOV = vkBB
    else if 1JoyPOV = 18000
        FirstJoyPOV = vkBD
    else FirstJoyPOV =
    }
else if 1JoyPOV = 0
    FirstJoyPOV = vk49
else if 1JoyPOV = 18000
    FirstJoyPOV = vk4B
else if 1JoyPOV = 27000
    FirstJoyPOV = vk58
else if 1JoyPOV = 9000
    FirstJoyPOV = vk43
else FirstJoyPOV = 

if FirstJoyPOV = %FirstJoyPOVPrev%
return

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

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

1Joy10::
{
    ControlSend,, {vkA0 Down}, WoT Client
    KeyWait, 1Joy10
    ControlSend,, {vkA0 Up}, WoT Client
}
return

;;;;;;;;;;;;Короткая остановка для выстрела

1Joy9::
{
    ControlSend,, {Space Down}, WoT Client
    KeyWait, 1Joy9
    ControlSend,, {Space Up}, WoT Client
}
return

;;;;;;;;;;;;выбор снарядов/ремонт двигателя

1Joy1::
if LT > 64
    {
    ControlSend,, {vk34 Down}, WoT Client
    ControlSend,, {vk31 Down}, WoT Client
    KeyWait, 1Joy1
    ControlSend,, {vk31 Up}, WoT Client
    ControlSend,, {vk34 Up}, WoT Client   
    }
else Gosub, FirstSubToggle
Return

FirstSubToggle:
FirstToggle++
If FirstToggle = 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 FirstToggle = 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 FirstToggle = 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
    FirstToggle = 0
}
return

;;;;;;;;;;;;огнетушитель/ремонт гусениц

1Joy4::
if LT > 64
    {
    ControlSend,, {vk34 Down}, WoT Client
    ControlSend,, {vk35 Down}, WoT Client
    KeyWait, 1Joy4
    ControlSend,, {vk35 Up}, WoT Client
    ControlSend,, {vk34 Up}, WoT Client   
    }
else
    {
    ControlSend,, {vk35 Down}, WoT Client
    KeyWait, 1Joy4
    ControlSend,, {vk35 Up}, WoT Client
    }
return

;;;;;;;;;;;;автоприцел

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

;;;;;;;;;;;;Enter

1Joy8::
{
    ControlSend,, {vk0D Down}, WoT Client
    KeyWait, 1Joy8
    ControlSend,, {vk0D Up}, WoT Client
}
return

;;;;;;;;;;;;Escape

1Joy7::
{
    ControlSend,, {vk1B Down}, WoT Client
    KeyWait, 1Joy7
    ControlSend,, {vk1B Up}, WoT Client    
}
return

;;;;;;;;;;;;меню приказов

1Joy5::
{
    ControlSend,, {vk5A Down}, WoT Client
    KeyWait, 1Joy5
    ControlSend,, {vk5A Up}, WoT Client    
}
return

;;;;;;;;;;;;ремонт/ремонт пушки

1Joy3::
if LT > 64
    {
    ControlSend,, {vk34 Down}, WoT Client
    ControlSend,, {vk33 Down}, WoT Client
    KeyWait, 1Joy3
    ControlSend,, {vk33 Up}, WoT Client
    ControlSend,, {vk34 Up}, WoT Client   
    }
else
    {
    ControlSend,, {vk34 Down}, WoT Client
    KeyWait, 1Joy3
    ControlSend,, {vk34 Up}, WoT Client   
    }
return

;;;;;;;;;;;;лечение/ремонт боеукладки

1Joy2::
if LT > 64
    {
    ControlSend,, {vk34 Down}, WoT Client
    ControlSend,, {vk32 Down}, WoT Client
    KeyWait, 1Joy2
    ControlSend,, {vk32 Up}, WoT Client
    ControlSend,, {vk34 Up}, WoT Client   
    }
else    
    {
    ControlSend,, {vk36 Down}, WoT Client
    KeyWait, 1Joy2
    ControlSend,, {vk36 Up}, WoT Client    
    }
return

;;;;;;;;;;;;проверка активности окна WoT

WatchWindow:
IfWinNotExist, WoT Client
{
ExitApp
}
return

;;;;;;;;;;;;запуск скрипта для игры в SplitScreen

SplitScreen:
IfWinNotExist, [#] WoT Client [#]
return
SetTimer, SplitScreen, Off
Run, %A_WorkingDir%\res_mods\SplitScreen.ahk
return

Назначение кнопок скрипта

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

http://cdn-frm-eu.wargaming.net/wot/ru/uploads/monthly_12_2014/post-6899376-0-37737300-1418978697.jpg
http://cdn-frm-eu.wargaming.net/wot/ru/uploads/monthly_12_2014/post-6899376-0-10592500-1418978710.jpg

11 (изменено: Alectric, 2014-12-27 22:40:56)

Re: Перемещения мыши в игре геймпадом [Решено]

А что за функции XInput_Init() и XInput_GetState() в твоем коде?
И где их содержимое?


...


Погуглил - теперь понятно.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

12 (изменено: Alectric, 2015-01-08 23:01:23)

Re: Перемещения мыши в игре геймпадом [Решено]

Наконец-то закончил оболочку.
Делюсь, опять же.

Настройки сохраняются в реестре, путь сохранения в переменной "Settingspath".

#if
#SingleInstance,Force
AutoTrim,Off
CoordMode,Mouse,Screen
CoordMode,ToolTip
CoordMode,Pixel
Menu,Tray,UseErrorLevel
process,priority,,high
;SendMode,input
SetBatchLines,-1
SetControlDelay,0
SetKeyDelay,0
SetTitleMatchMode,2
SetWinDelay,20
SetWorkingDir,%A_ScriptDir%
StringCaseSense,On
DetectHiddenWindows,On

key:={"":"Нет","vk01":"LButton","vk02":"RButton","vk04":"MButton","vk05":"X1Button","vk06":"X2Button","vk08":"BS","vk09":"TAB","vk0D":"Enter","vk10":"Shift","vk11":"Ctrl","vk12":"Alt","vk13":"Pause","vk14":"Caps","vk1B":"Esc","vk20":"Space","vk21":"PgUp","vk22":"PgDn","vk23":"End","vk24":"Home","vk25":"Left","vk26":"Up","vk27":"Right","vk28":"Down","vk29":"Select","vk2A":"Print","vk2B":"Execute","vk2C":"PrScr","vk2D":"Ins","vk2E":"Del","vk2F":"Help","vk30":"0","vk31":"1","vk32":"2","vk33":"3","vk34":"4","vk35":"5","vk36":"6","vk37":"7","vk38":"8","vk39":"9","vk41":"A","vk42":"B","vk43":"C","vk44":"D","vk45":"E","vk46":"F","vk47":"G","vk48":"H","vk49":"I","vk4A":"J","vk4B":"K","vk4C":"L","vk4D":"M","vk4E":"N","vk4F":"O","vk50":"P","vk51":"Q","vk52":"R","vk53":"S","vk54":"T","vk55":"U","vk56":"V","vk57":"W","vk58":"X","vk59":"Y","vk5A":"Z","vk5B":"LWin","vk5C":"RWin","vk5D":"App","vk60":"Num0","vk61":"Num1","vk62":"Num2","vk63":"Num3","vk64":"Num4","vk65":"Num5","vk66":"Num6","vk67":"Num7","vk68":"Num8","vk69":"Num9","vk6A":"*","vk6B":"+","vk6D":"-","vk6E":"Dec","vk6F":"/","vk70":"F1","vk71":"F2","vk72":"F3","vk73":"F4","vk74":"F5","vk75":"F6","vk76":"F7","vk77":"F8","vk78":"F9","vk79":"F10","vk7A":"F11","vk7B":"F12","vk90":"NumLck","vk91":"ScrLck","vkAD":"Vol Mute","vkAE":"Vol Down","vkAF":"Vol Up","vkB0":"Next Track","vkB1":"Previous Track","vkB3":"Play/Pause Media"}

vkod:={"Нет":"","LButton":"vk01","RButton":"vk02","MButton":"vk04","X1Button":"vk05","X2Button":"vk06","BS":"vk08","TAB":"vk09","Enter":"vk0D","Shift":"vk10","Ctrl":"vk11","Alt":"vk12","Pause":"vk13","Caps":"vk14","Esc":"vk1B","Space":"vk20","PgUp":"vk21","PgDn":"vk22","End":"vk23","Home":"vk24","Left":"vk25","Up":"vk26","Right":"vk27","Down":"vk28","Select":"vk29","Print":"vk2A","Execute":"vk2B","PrScr":"vk2C","Ins":"vk2D","Del":"vk2E","Help":"vk2F","0":"vk30","1":"vk31","2":"vk32","3":"vk33","4":"vk34","5":"vk35","6":"vk36","7":"vk37","8":"vk38","9":"vk39","A":"vk41","B":"vk42","C":"vk43","D":"vk44","E":"vk45","F":"vk46","G":"vk47","H":"vk48","I":"vk49","J":"vk4A","K":"vk4B","L":"vk4C","M":"vk4D","N":"vk4E","O":"vk4F","P":"vk50","Q":"vk51","R":"vk52","S":"vk53","T":"vk54","U":"vk55","V":"vk56","W":"vk57","X":"vk58","Y":"vk59","Z":"vk5A","LWin":"vk5B","RWin":"vk5C","App":"vk5D","Num0":"vk60","Num1":"vk61","Num2":"vk62","Num3":"vk63","Num4":"vk64","Num5":"vk65","Num6":"vk66","Num7":"vk67","Num8":"vk68","Num9":"vk69","*":"vk6A","+":"vk6B","-":"vk6D","Dec":"vk6E","/":"vk6F","F1":"vk70","F2":"vk71","F3":"vk72","F4":"vk73","F5":"vk74","F6":"vk75","F7":"vk76","F8":"vk77","F9":"vk78","F10":"vk79","F11":"vk7A","F12":"vk7B","NumLck":"vk90","ScrLck":"vk91","Vol Mute":"vkAD","Vol Down":"vkAE","Vol Up":"vkAF","Next Track":"vkB0","Previous Track":"vkB1","Play/Pause Media":"vkB3"}

List=Нет|0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|LButton|RButton|MButton|X1Button|X2Button|BS|TAB|Enter|Shift|Ctrl|Alt|Pause|Caps|Esc|Space|PgUp|PgDn|End|Home|Left|Up|Right|Down|Select|Print|Execute|PrScr|Ins|Del|Help|LWin|RWin|App|Num0|Num1|Num2|Num3|Num4|Num5|Num6|Num7|Num8|Num9|*|+|-|Dec|/|F1|F2|F3|F4|F5|F6|F7|F8|F9|F10|F11|F12|NumLck|ScrLck|Vol Mute|Vol Down|Vol Up|Next Track|Previous Track|Play/Pause Media

Settingspath=SOFTWARE\DF\Joystics

Joystics=0:Поумолчанию
GetKeyState,Name,JoyName
GetKeyState,Info,JoyInfo
GetKeyState,Buttons,JoyButtons
num=
loop,10
{
  GetKeyState,Names,%a_index%JoyName
  if Names=
    continue
  num++
  GetKeyState,Name%num%,%num%JoyName
  GetKeyState,Info%num%, %num%JoyInfo
  GetKeyState,Buttons%num%,%num%JoyButtons
  Joystics.="|" num ":"Name%num% " " Info%num% " " Buttons%num%
  Joystics%num%:=Name%num% " " Info%num% " " Buttons%num%
}

ifexist,%a_scriptdir%\joy.ico
  Menu,Tray,Icon,%a_scriptdir%\joy.ico
;Menu,Tray,NoStandard
Menu,Tray,Add,Настройки,Settings
Menu,Tray,Add,Выход,Exit
Menu,Tray,default,Настройки

gosub,LoadSettings

Gui,Add,Picture,x13 y36,joy.png
Gui,Add,checkbox,x507 y352 Checked%mousemode% vmousemode,Правый стик = Мышь
Gui,Add,text,x507 y372,Скорость:
Gui,Add,Edit,x560 y369 w30 -Multi vJoyMultiplier,%JoyMultiplier%
Gui,Add,ComboBox,x277 y374 w60 v_BLLeft,%List%
Gui,Add,ComboBox,x277 y397 w60 v_BLRight,%List%
Gui,Add,ComboBox,x204 y374 w60 v_BLUp,%List%
Gui,Add,ComboBox,x204 y397 w60 v_BLDown,%List%
Gui,Add,ComboBox,x348 y374 w60 v_BRLeft,%List%
Gui,Add,ComboBox,x348 y397 w60 v_BRRight,%List%
Gui,Add,ComboBox,x421 y374 w60 v_BRUp,%List%
Gui,Add,ComboBox,x421 y397 w60 v_BRDown,%List%
Gui,Add,ComboBox,x520 y247 w60 v_B1,%List%
Gui,Add,ComboBox,x520 y215 w60 v_B2,%List%
Gui,Add,ComboBox,x520 y277 w60 v_B3,%List%
Gui,Add,ComboBox,x520 y185 w60 v_B4,%List%
Gui,Add,ComboBox,x103 y152 w60 v_B5,%List%
Gui,Add,ComboBox,x520 y152 w60 v_B6,%List%
Gui,Add,ComboBox,x103 y117 w60 v_B7,%List%
Gui,Add,ComboBox,x519 y118 w60 v_B8,%List%
Gui,Add,ComboBox,x255 y73 w60 v_B9,%List%
Gui,Add,ComboBox,x365 y73 w60 v_B10,%List%
Gui,Add,ComboBox,x103 y308 w60 v_B11,%List%
Gui,Add,ComboBox,x520 y308 w60 v_B12,%List%
Gui,Add,ComboBox,x68 y185 w46 v_P0,%List%
Gui,Add,ComboBox,x116 y185 w46 v_P1,%List%
Gui,Add,ComboBox,x116 y230 w46 v_P2,%List%
Gui,Add,ComboBox,x116 y275 w46 v_P3,%List%
Gui,Add,ComboBox,x68 y275 w46 v_P4,%List%
Gui,Add,ComboBox,x20 y275 w46 v_P5,%List%
Gui,Add,ComboBox,x20 y230 w46 v_P6,%List%
Gui,Add,ComboBox,x20 y185 w46 v_P7,%List%
Gui,Add,ComboBox,x17 y10 w610 vJoystic gChengeDev,%Joystics%
Gui,Add,text,x17 y35 w230 h65,Info
Gui,Add,text,x80 y233,POV
Gui,Add,text,x214 y419 w60,X
Gui,Add,text,x285 y419 w60,Y
Gui,Add,text,x357 y419 w60,Z
Gui,Add,text,x430 y419 w60,R
Gui,Add,text,x193 y378,U:
Gui,Add,text,x193 y400,D:
Gui,Add,text,x267 y378,L:
Gui,Add,text,x267 y400,R:
Gui,Add,text,x339 y378,L:
Gui,Add,text,x339 y400,R:
Gui,Add,text,x411 y378,U:
Gui,Add,text,x411 y400,D:
Gui,Add,text,x582 y250,Button 1
Gui,Add,text,x582 y218,Button 2
Gui,Add,text,x582 y280,Button 3
Gui,Add,text,x582 y188,Button 4
Gui,Add,text,x55 y155,Button 5
Gui,Add,text,x582 y155,Button 6
Gui,Add,text,x55 y121,Button 7
Gui,Add,text,x582 y121,Button 8
Gui,Add,text,x264 y58,Button 9
Gui,Add,text,x371 y58,Button 10
Gui,Add,text,x55 y311,Button 11
Gui,Add,text,x582 y311,Button 12
Gui,Add,groupbox,x15 y173 w153 h129
gui,add,button,x570 y400 w60 h25 gOk,Oк
gui,add,button,x500 y400 w60 h25 gCencel,Отмена
gui,add,button,x500 y40 w130 h25 gFindJoys,Find Joy's
Gui,Add,checkbox,x13 y342 w175 h27 Checked%keysendmode% gSubmit vkeysendmode,Посылать нажатия в НЕактивное окно (недоделано)
Gui,Add,text,x13 y373,PID:
Gui,Add,Edit,x50 y370 w50 -Multi vPID,%PID%
Gui,Add,text,x13 y396,Title:
Gui,Add,Edit,x50 y393 w140 -Multi vTitle,%Title%
Gui,Add,text,x13 y419,Class:
Gui,Add,Edit,x50 y416 w140 -Multi vClass,%Class%
GuiControl,+default,Oк

SettingsDefault=
(
keysendmode=0
PID=
title=
class=
JoyMultiplier=5
mousemode=1
BLLeft=vk25
BLRight=vk27
BLUp=vk26
BLDown=vk28
BRLeft=vk64
BRRight=vk66
BRUp=vk68
BRDown=vk62
B1=vk12
B2=vk20
B3=vk11
B4=vk26
B5=vk51
B6=vk5a
B7=vk71
B8=vk4b
B9=vk1b
B10=vk0D
B11=vk01
B12=vk02
P0=vk26
P1=vk59
P2=vk27
P3=
P4=vk28
P5=
P6=vk25
P7=vk4e
)

gosub,settings

loop
{
;  if oldtime!=
;    time:=a_tickcount-oldtime
;  oldtime:=a_tickcount
;  if time<10
    sleep,1
; POV -----------------------------------------------------------------------------
  ifinstring,Info%JoystickNumber%,P
  {
    _Ojp:=_jp
    OldPOV:=POV
    jp:=GetKeyState(JoystickNumber . "JoyPOV")/4500
    if jp<0
    {
      jp=-1
      POV=
    }
    else
    {
      jp:=round(jp)
      POV:=P%jp%
    }
    if (OldPOV!=POV)
    {
      if set=1
      {
        _jp:=jp+21
        if _Ojp between 21 and 28
          GuiControl,Enable,ComboBox%_ojp%
        if _jp between 21 and 28
          GuiControl,Disable,ComboBox%_jp%
      }
      else
      {
        if OldPOV!=
        {
          if keysendmode=0
            Send, {%OldPOV% Up}
          else
          {
            SendMessage,0x06,1,,,%window%
            ControlSend,,{%OldPOV% Up},%Window%
          }
        }
        if POV!=
        {
          if keysendmode=0
            Send, {%POV% Down}
          else
          {
            SendMessage,0x06,1,,,%window%
            ControlSend,,{%OldPOV% Down},%Window%
          }
        }
      }
    }
  }
; Buttons -------------------------------------------------------------------------
  GetKeyState,joy_buttons,%JoystickNumber%JoyButtons
  Loop,%joy_buttons%
  {
    GetKeyState,Bstate%a_index%,%JoystickNumber%joy%a_index%
    if (Bstate%a_index%="U" and joy%a_index%=1)
    {
      joy%a_index%=
      b:=B%a_index%
      if set=1
      {
        n:=a_index+8
        GuiControl,Enable,ComboBox%n%
      }
      else
      {
        if keysendmode=0
          send {%b% Up}
        else
        {
          SendMessage,0x06,1,,,%window%
          ControlSend,,{%b% Up},%Window%
        }
      }
    }
    else if (Bstate%a_index%="D" and set=1)
    {
      n:=a_index+8
      GuiControl,Disable,ComboBox%n%
    }
  }
if set=1
{
  if keysendmode=1
  {
    mousegetpos,,,win
    WinGet,_PID,PID,ahk_id %win%
    WinGettitle,_title,ahk_id %win%
    WinGetclass,_class,ahk_id %win%
    if _class not contains tooltip
      tooltip,PID: %_pid%`nTitle: %_Title%`nClass: %_class%`n`nИспользовать пид нажмите F1`nИспользовать название окна F2`nИспользовать класс окна F3
    else
      tooltip
  }
  else
    tooltip
  JoyX_:=round(GetKeyState(JoystickNumber . "JoyX"))
  JoyY_:=round(GetKeyState(JoystickNumber . "JoyY"))
  JoyZ_:=round(GetKeyState(JoystickNumber . "JoyZ"))
  JoyR_:=round(GetKeyState(JoystickNumber . "JoyR"))
  ControlSetText,static5,X  %JoyX_%,Настройки джойстика
  ControlSetText,static6,Y  %JoyY_%,Настройки джойстика
  ControlSetText,static7,Z  %JoyZ_%,Настройки джойстика
  ControlSetText,static8,R  %JoyR_%,Настройки джойстика
  continue
}
; Левый стик -----------------------------------------------------------------------------
  if Name%JoystickNumber%=
    continue
  GetKeyState,JoyY,%JoystickNumber%JoyY
  if (Joyy<60 and chekY1="")  ; левый вниз
  {
    chekY1=1
    if keysendmode=0
      send,{%BLDown% up}
    else
    {
      SendMessage,0x06,1,,,%window%
      ControlSend,,{%BLDown% up},%Window%
    }
  }
  else if (Joyy>80 and chekY1=1)
  {
    chekY1=
    if keysendmode=0
      send,{%BLDown% down}
    else
    {
      SendMessage,0x06,1,,,%window%
      ControlSend,,{%BLDown% down},%Window%
    }
  }

  if (Joyy>40 and chekY2="")  ; левый вверх
  {
    chekY2=1
    if keysendmode=0
      send,{%BLUp% up}
    else
    {
      SendMessage,0x06,1,,,%window%
      ControlSend,,{%BLUp% up},%Window%
    }
  }
  else if (Joyy<20 and chekY2=1)
  {
    chekY2=
    if keysendmode=0
      send,{%BLUp% down}
    else
    {
      SendMessage,0x06,1,,,%window%
      ControlSend,,{%BLUp% down},%Window%
    }
  }

  GetKeyState,JoyX,%JoystickNumber%JoyX
  if (Joyx<60 and chekX1="")  ; левый вправо
  {
    chekX1=1
    if keysendmode=0
      send,{%BLRight% up}
    else
    {
      SendMessage,0x06,1,,,%window%
      ControlSend,,{%BLRight% up},%Window%
    }
  }
  else if (Joyx>80 and chekX1=1)
  {
    chekX1=
    if keysendmode=0
      send,{%BLRight% down}
    else
    {
      SendMessage,0x06,1,,,%window%
      ControlSend,,{%BLRight% down},%Window%
    }
  }

  if (Joyx>40 and chekX2="")  ; левый влево
  {
    chekX2=1
    if keysendmode=0
      send,{%BLLeft% up}
    else
    {
      SendMessage,0x06,1,,,%window%
      ControlSend,,{%BLLeft% up},%Window%
    }
  }
  else if (Joyx<20 and chekX2=1)
  {
    chekX2=
    if keysendmode=0
      send,{%BLLeft% down}
    else
    {
      SendMessage,0x06,1,,,%window%
      ControlSend,,{%BLLeft% down},%Window%
    }
  }

; Правый стик -----------------------------------------------------------------------------
  if mousemode=0
  {
    GetKeyState,JoyR,%JoystickNumber%JoyR
    if (Joyr>40 and Joyr<60 and chekR="")  ; правый верх низ
    {
      chekR=1
      if keysendmode=0
        send,{%BRDown% up}{%BRUp% up}
      else
      {
        SendMessage,0x06,1,,,%window%
        ControlSend,,{%BRDown% up}{%BRUp% up},%Window%
      }
    }
    else if (Joyr>80 and chekR=1)
    {
      chekR=
      if keysendmode=0
        send,{%BRDown% down}
      else
      {
        SendMessage,0x06,1,,,%window%
        ControlSend,,{%BRDown% down},%Window%
      }
    }
    else if (Joyr<20 and chekR=1)
    {
      chekR=
      if keysendmode=0
        send,{%BRUp% down}
      else
      {
        SendMessage,0x06,1,,,%window%
        ControlSend,,{%BRUp% down},%Window%
      }
    }

    GetKeyState,JoyZ,%JoystickNumber%JoyZ
    if (Joyz>40 and Joyz<60 and chekZ="")  ; правый лево право
    {
      chekZ=1
      if keysendmode=0
        send,{%BRLeft% up}{%BRRight% up}
      else
      {
        SendMessage,0x06,1,,,%window%
        ControlSend,,{%BRLeft% up}{%BRRight% up},%Window%
      }
    }
    else if (Joyz>80 and chekZ=1)
    {
      chekZ=
      if keysendmode=0
        send,{%BRRight% down}
      else
      {
        SendMessage,0x06,1,,,%window%
        ControlSend,,{%BRRight% down},%Window%
      }
    }
    else if (Joyz<20 and chekZ=1)
    {
      chekZ=
      if keysendmode=0
        send,{%BRLeft% down}
      else
      {
        SendMessage,0x06,1,,,%window%
        ControlSend,,{%BRLeft% down},%Window%
      }
    }
  }
  else ; Mouse -----------------------------------------------------------------------------
  {
    DeltaZ:=GetKeyState(JoystickNumber . "JoyZ")-50
    DeltaR:=GetKeyState(JoystickNumber . "JoyR")-50
    if (ABS(DeltaZ)>1 or ABS(DeltaR)>1)
    {
      IntX := (DeltaZ/60)*JoyMultiplier*mult
      IntY := (DeltaR/60)*JoyMultiplier*mult
;tooltip,%DeltaZ% %DeltaR%`n%IntX% %IntY%
      mult+=0.01
      if mult<0.01
        mult=0.01
      x := 0
      y := 0
      if ABS(IntX) <= 1
      {
        PrevX += IntX
        if ABS(PrevX) >= 1
        {
          x := PrevX
          PrevX := 0
        }
      }
      else
      {
        x := IntX
        PrevX := 0
      }
      if ABS(IntY) <= 1z
      {
        PrevY += IntY
        if ABS(PrevY) >= 1
        {
          y := PrevY
          PrevY :=0
        }
      }
      else
      {
        y := IntY
        PrevY := 0
      }
      DllCall("mouse_event", uint, 1, int, x, int, y, uint, 0, int, 0)
    }
    else
      mult=0.5
  }
; End -----------------------------------------------------------------------------
}
return

joy1::
joy1=1
if set=
{
  if keysendmode=0
    send,{%b1% down}
  else
  {
    SendMessage,0x06,1,,,%window%
    ControlSend,,{%b1% down},%Window%
  }
}
return

joy2::
joy2=1
if set=
{
  if keysendmode=0
    send,{%b2% down}
  else
  {
    SendMessage,0x06,1,,,%window%
    ControlSend,,{%b2% down},%Window%
  }
}
return

joy3::
joy3=1
if set=
{
  if keysendmode=0
    send,{%b3% down}
  else
  {
    SendMessage,0x06,1,,,%window%
    ControlSend,,{%b3% down},%Window%
  }
}
return

joy4::
joy4=1
if set=
{
  if keysendmode=0
    send,{%b4% down}
  else
  {
    SendMessage,0x06,1,,,%window%
    ControlSend,,{%b4% down},%Window%
  }
}
return

joy5::
joy5=1
if set=
{
  if keysendmode=0
    send,{%b5% down}
  else
  {
    SendMessage,0x06,1,,,%window%
    ControlSend,,{%b5% down},%Window%
  }
}
return

joy6::
joy6=1
if set=
{
  if keysendmode=0
    send,{%b6% down}
  else
  {
    SendMessage,0x06,1,,,%window%
    ControlSend,,{%b6% down},%Window%
  }
}
return

joy7::
joy7=1
if set=
{
  if keysendmode=0
    send,{%b7% down}
  else
  {
    SendMessage,0x06,1,,,%window%
    ControlSend,,{%b7% down},%Window%
  }
}
return

joy8::
joy8=1
if set=
{
  if keysendmode=0
    send,{%b8% down}
  else
  {
    SendMessage,0x06,1,,,%window%
    ControlSend,,{%b8% down},%Window%
  }
}
return

joy9::
joy9=1
if set=
{
  if keysendmode=0
    send,{%b9% down}
  else
  {
    SendMessage,0x06,1,,,%window%
    ControlSend,,{%b9% down},%Window%
  }
}
if (joy10=1 and mousemode=1)
{
  mousemode=0
  tooltip,Правый стик = Кнопки
  settimer,removetooltip,-2000
}
else if (joy10=1 and mousemode=0)
{
  mousemode=1
  tooltip,Правый стик = Мышь
  settimer,removetooltip,-3000
}
return

joy10::
joy10=1
if set=
{
  if keysendmode=0
    send,{%b10% down}
  else
  {
    SendMessage,0x06,1,,,%window%
    ControlSend,,{%b10% down},%Window%
  }
}
if (joy9=1 and mousemode=1)
{
  mousemode=0
  tooltip,Правый стик = Кнопки
}
else if (joy9=1 and mousemode=0)
{
  mousemode=1
  tooltip,Правый стик = Мышь
}
return

joy11::
joy11=1
if set=
{
  if keysendmode=0
    send,{%b11% down}
  else
  {
    SendMessage,0x06,1,,,%window%
    ControlSend,,{%b11% down},%Window%
  }
}
return

joy12::
joy12=1
if set=
{
  if keysendmode=0
    send,{%b12% down}
  else
  {
    SendMessage,0x06,1,,,%window%
    ControlSend,,{%b12% down},%Window%
  }
}
return

ChengeDev:
tooltip
gui,submit,nohide
StringLeft,JoystickNumber,Joystic,1
if JoystickNumber=0
  JoystickNumber=
RegWrite,REG_SZ,HKCU,%Settingspath%,JoystickNumber,%JoystickNumber%
gosub,LoadSettings
Control,ChooseString,% key["" BLLeft ""],ComboBox1,Настройки джойстика
Control,ChooseString,% key["" BLRight ""],ComboBox2,Настройки джойстика
Control,ChooseString,% key["" BLUp ""],ComboBox3,Настройки джойстика
Control,ChooseString,% key["" BLDown ""],ComboBox4,Настройки джойстика
Control,ChooseString,% key["" BRLeft ""],ComboBox5,Настройки джойстика
Control,ChooseString,% key["" BRRight ""],ComboBox6,Настройки джойстика
Control,ChooseString,% key["" BRUp ""],ComboBox7,Настройки джойстика
Control,ChooseString,% key["" BRDown ""],ComboBox8,Настройки джойстика
Control,ChooseString,% key["" B1 ""],ComboBox9,Настройки джойстика
Control,ChooseString,% key["" B2 ""],ComboBox10,Настройки джойстика
Control,ChooseString,% key["" B3 ""],ComboBox11,Настройки джойстика
Control,ChooseString,% key["" B4 ""],ComboBox12,Настройки джойстика
Control,ChooseString,% key["" B5 ""],ComboBox13,Настройки джойстика
Control,ChooseString,% key["" B6 ""],ComboBox14,Настройки джойстика
Control,ChooseString,% key["" B7 ""],ComboBox15,Настройки джойстика
Control,ChooseString,% key["" B8 ""],ComboBox16,Настройки джойстика
Control,ChooseString,% key["" B9 ""],ComboBox17,Настройки джойстика
Control,ChooseString,% key["" B10 ""],ComboBox18,Настройки джойстика
Control,ChooseString,% key["" B11 ""],ComboBox19,Настройки джойстика
Control,ChooseString,% key["" B12 ""],ComboBox20,Настройки джойстика
Control,ChooseString,% key["" P0 ""],ComboBox21,Настройки джойстика
Control,ChooseString,% key["" P1 ""],ComboBox22,Настройки джойстика
Control,ChooseString,% key["" P2 ""],ComboBox23,Настройки джойстика
Control,ChooseString,% key["" P3 ""],ComboBox24,Настройки джойстика
Control,ChooseString,% key["" P4 ""],ComboBox25,Настройки джойстика
Control,ChooseString,% key["" P5 ""],ComboBox26,Настройки джойстика
Control,ChooseString,% key["" P6 ""],ComboBox27,Настройки джойстика
Control,ChooseString,% key["" P7 ""],ComboBox28,Настройки джойстика
ControlSetText,Edit1,%JoyMultiplier%,Настройки джойстика
ControlSetText,Edit31,%PID%,Настройки джойстика
ControlSetText,Edit32,%title%,Настройки джойстика
ControlSetText,Edit33,%class%,Настройки джойстика
Controlsettext,Static3,% "Имя: " Name%JoystickNumber% "`nДоп. оси: " Info%JoystickNumber% "`nКнопок: " Buttons%JoystickNumber%,Настройки джойстика
if mousemode=1
  Control,Check,,Button1,Настройки джойстика
else
  Control,UnCheck,,Button1,Настройки джойстика
if keysendmode=1
  Control,Check,,Button6,Настройки джойстика
else
  Control,UnCheck,,Button6,Настройки джойстика
return

Settings:
RegRead,JoystickNumber,HKCU,%Settingspath%,JoystickNumber
gui,show,,Настройки джойстика
sell:=JoystickNumber+1
sell:= JoystickNumber="" ? 1 : sell
Control,Choose,% sell,ComboBox29,Настройки джойстика
;gosub,ChengeDev
set=1
return

Submit:
gui,submit,nohide
return

Ok:
if title!=
  Window=%title%
if class!=
  Window=ahk_class %class%
if pid!=
  Window=ahk_pid %pid%
if keysendmode=1
  tooltip,%Window%
settimer,removetooltip,-2000
set=
gui,submit
BLLeft:=vkod["" _BLLeft ""]
BLRight:=vkod["" _BLRight ""]
BLUp:=vkod["" _BLUp ""]
BLDown:=vkod["" _BLDown ""]
BRLeft:=vkod["" _BRLeft ""]
BRRight:=vkod["" _BRRight ""]
BRUp:=vkod["" _BRUp ""]
BRDown:=vkod["" _BRDown ""]
B1:=vkod["" _B1 ""]
B2:=vkod["" _B2 ""]
B3:=vkod["" _B3 ""]
B4:=vkod["" _B4 ""]
B5:=vkod["" _B5 ""]
B6:=vkod["" _B6 ""]
B7:=vkod["" _B7 ""]
B8:=vkod["" _B8 ""]
B9:=vkod["" _B9 ""]
B10:=vkod["" _B10 ""]
B11:=vkod["" _B11 ""]
B12:=vkod["" _B12 ""]
P0:=vkod["" _P0 ""]
P1:=vkod["" _P1 ""]
P2:=vkod["" _P2 ""]
P3:=vkod["" _P3 ""]
P4:=vkod["" _P4 ""]
P5:=vkod["" _P5 ""]
P6:=vkod["" _P6 ""]
P7:=vkod["" _P7 ""]
gosub,SaveSettings
return

Cencel:
settimer,removetooltip,-2000
set=
gui,hide
return

SaveSettings:
RegWrite,REG_SZ,HKCU,%Settingspath%,JoystickNumber,%JoystickNumber%
loop,parse,SettingsDefault,`n
{
  Loop,parse,a_loopfield,=
  {
    if a_index=1
    {
      Setting:=a_loopfield
      Break
    }
  }
  RegWrite,REG_SZ,HKCU,%Settingspath%%Joystic%,%Setting%,% %Setting%
}
LoadSettings:
loop,parse,SettingsDefault,`n
{
  Loop,parse,a_loopfield,=
  {
    if a_index=1
      Setting:=a_loopfield
    else if a_index=2
      Default:=a_loopfield
    else
      Default.="=" a_loopfield
  }
  RegRead,%Setting%,HKCU,%Settingspath%%Joystic%,%Setting%
  RegRead,Rtmp,HKCU,%Settingspath%%Joystic%,%Setting%
  if Rtmp=
  {
    RegWrite,REG_SZ,HKCU,%Settingspath%%Joystic%,%Setting%,%Default%
    RegRead,%Setting%,HKCU,%Settingspath%%Joystic%,%Setting%
  }
}
return

Exit:
exitapp
return

FindJoys:
run,%a_scriptfullpath%
Exitapp
return

RemoveToolTip:
tooltip
return

#if set=1
F1::
if ChengeDev!=
  return
ControlSetText,Edit31,%_PID%,Настройки джойстика
ControlSetText,Edit32,,Настройки джойстика
ControlSetText,Edit33,,Настройки джойстика
gui,submit,nohide
gosub,Ok
return

F2::
if ChengeDev!=
  return
ControlSetText,Edit31,,Настройки джойстика
ControlSetText,Edit32,%_Title%,Настройки джойстика
ControlSetText,Edit33,,Настройки джойстика
gui,submit,nohide
gosub,Ok
return

F3::
if ChengeDev!=
  return
ControlSetText,Edit31,,Настройки джойстика
ControlSetText,Edit32,,Настройки джойстика
ControlSetText,Edit33,%_class%,Настройки джойстика
gui,submit,nohide
gosub,Ok
return
#if

С картинкой интерфейс получше выглядит.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

13 (изменено: kharlashkin, 2014-12-28 17:36:50)

Re: Перемещения мыши в игре геймпадом [Решено]

Alectric пишет:

Наконец-то закончил оболочку.
Делюсь, опять же.

С картинкой интерфейс получше выглядит.

Я картинку тоже хотел приложить (как у меня кнопки переназначены), но правильные оригиналы на другом ПК, к которому доступ будет только в понедельник, а копии выложенные на res_mods, пока не одобрены тамошними модераторами.

В будущем тоже хотел GUI прикрутить, пока времени нет разобраться катастрофически. На картинке видно DualShock, если ли он в наличии у Вас?

14 (изменено: Alectric, 2015-01-08 13:52:36)

Re: Перемещения мыши в игре геймпадом [Решено]

kharlashkin пишет:

На картинке видно DualShock, если ли он в наличии у Вас?

Для него собственно и делал.

Интерфейс также подойдет и для других, кроме тех у которых есть оси V и U, и у которых более 12-и кнопок.
Там индикация на нажатия кнопок и осей в настройках, и если джойстиков несколько настройки сохраняются отдельно.


...

Подправил несколько мелочей в коде выше.

...

Устранил ошибку загрузки настроек.
...

Еще раз устранил туже ошибку только по другому... Теперь уж наверняка.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

15 (изменено: Alectric, 2015-01-08 13:52:14)

Re: Перемещения мыши в игре геймпадом [Решено]

Добавил возможность посылать нажатия в неактивное окно.

...

Добавил отправку по названию окна и по классу окна.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

16

Re: Перемещения мыши в игре геймпадом [Решено]

Alectric пишет:

Добавил возможность посылать нажатия в неактивное окно.

...

Добавил отправку по названию окна и по классу окна.

С чем тестировали? Мышь в неактивном окне работает?

17 (изменено: Alectric, 2015-01-08 15:18:51)

Re: Перемещения мыши в игре геймпадом [Решено]

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

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

18

Re: Перемещения мыши в игре геймпадом [Решено]

Alectric пишет:

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

Тогда вот Вам ссылка - не наступайте на мои грабли

19

Re: Перемещения мыши в игре геймпадом [Решено]

Добавление "SendMessage,0x06,1,,,%window%" перед каждым "ControlSend" не решает проблемы... Может я что-то недоглядел в той теме?

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

20

Re: Перемещения мыши в игре геймпадом [Решено]

Alectric пишет:

Добавление "SendMessage,0x06,1,,,%window%" перед каждым "ControlSend" не решает проблемы... Может я что-то недоглядел в той теме?

Для танков отправка клавиатурных клавиш прокатила, чему я был несказанно рад в свое время. Для отправки нажатий кнопок мыши, и колесика другое сообщение:

SendMessage, 0x201,,,, WoT Client ;нажать ЛКМ
SendMessage, 0x202,,,, WoT Client ; отпустить ЛКМ
SendMessage, 0x204, 1,,, WoT Client ;нажать ПКМ
SendMessage, 0x205, 1,,, WoT Client ;отпустить ПКМ

21

Re: Перемещения мыши в игре геймпадом [Решено]

Совершенно случайно наткнулся вот на такую информацию:

Координаты мыши
Функция mouse_event имеет специфическую особенность: координаты мыши задаются в mickey, а не в пикселях. Перерасчет mickey в пиксели (и обратно) зависит от разрешения основного используемого монитора. (0,0) соответствует левому верхнему углу монитора, а (65535, 65535) нижнему правому, что дает формулы для пересчета mickey в пиксели и обратно: mickey_point = pixel_point * (65536, 65536) / screen_size и pixel_point = mickey_point * screen_size / (65536, 65536).

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