1

Тема: AHK: Отклонение мыши джойстиком

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

; Увеличьте это значение, чтобы курсор двигался быстрее.
JoyMultiplier = 0.30

; Уменьшите это значение, чтобы курсор начинал двигаться при меньшем отклонении
; осей джойстика. Однако, может понадобиться калибровка джойстика, чтобы добиться
; его хорошей центровки и избежать дрейфа курсора. С хорошо отцентрованным
; джойстиком может использоваться значение 1.
JoyThreshold = 3

; Измените значение на true, чтобы инвертировать ось Y и заставить мышь
; двигаться вертикально в направлении, обратном движению рукоятки (или как там
; эта штука называется - YMP).
InvertYAxis := false

; Измените эти значения, чтобы использовать для кнопок мыши другие кнопки 
; джойстика, а не 1, 2 и 3. Возможные значения от 1 до 32.
ButtonLeft = 1
ButtonRight = 2
ButtonMiddle = 3

; Если ваш джойстик имеет POV control (понятия не имею, что за фигня - YMP),
; вы можете использовать его как колесо мыши. Значение ниже означает количество
; миллисекунд между поворотами колеса. Уменьшите, чтобы ускорить колесо.
WheelDelay = 250

; Если в системе больше одного джойстика, укажите здесь номер того, который
; нужно использовать.
JoystickNumber = 1

; КОНЕЦ РАЗДЕЛА НАСТРОЕК -- не изменяйте то, что ниже, если только вы не
; хотите изменить базовый функционал скрипта.

#SingleInstance

JoystickPrefix = %JoystickNumber%Joy
Hotkey, %JoystickPrefix%%ButtonLeft%, ButtonLeft
Hotkey, %JoystickPrefix%%ButtonRight%, ButtonRight
Hotkey, %JoystickPrefix%%ButtonMiddle%, ButtonMiddle

; Calculate the axis displacements that are needed to start moving the cursor:
JoyThresholdUpper := 50 + JoyThreshold
JoyThresholdLower := 50 - JoyThreshold
if InvertYAxis
    YAxisMultiplier = -1
else
    YAxisMultiplier = 1

SetTimer, WatchJoystick, 10  ; Monitor the movement of the joystick.

GetKeyState, JoyInfo, %JoystickNumber%JoyInfo
IfInString, JoyInfo, P  ; Joystick has POV control, so use it as a mouse wheel.
    SetTimer, MouseWheel, %WheelDelay%

return  ; End of auto-execute section.


; The subroutines below do not use KeyWait because that would sometimes trap the
; WatchJoystick quasi-thread beneath the wait-for-button-up thread, which would
; effectively prevent mouse-dragging with the joystick.

ButtonLeft:
SetMouseDelay, -1  ; Makes movement smoother.
MouseClick, left,,, 1, 0, D  ; Hold down the left mouse button.
SetTimer, WaitForLeftButtonUp, 10
return

ButtonRight:
SetMouseDelay, -1  ; Makes movement smoother.
MouseClick, right,,, 1, 0, D  ; Hold down the right mouse button.
SetTimer, WaitForRightButtonUp, 10
return

ButtonMiddle:
SetMouseDelay, -1  ; Makes movement smoother.
MouseClick, middle,,, 1, 0, D  ; Hold down the right mouse button.
SetTimer, WaitForMiddleButtonUp, 10
return

WaitForLeftButtonUp:
if GetKeyState(JoystickPrefix . ButtonLeft)
    return  ; The button is still, down, so keep waiting.
; Otherwise, the button has been released.
SetTimer, WaitForLeftButtonUp, off
SetMouseDelay, -1  ; Makes movement smoother.
MouseClick, left,,, 1, 0, U  ; Release the mouse button.
return

WaitForRightButtonUp:
if GetKeyState(JoystickPrefix . ButtonRight)
    return  ; The button is still, down, so keep waiting.
; Otherwise, the button has been released.
SetTimer, WaitForRightButtonUp, off
MouseClick, right,,, 1, 0, U  ; Release the mouse button.
return

WaitForMiddleButtonUp:
if GetKeyState(JoystickPrefix . ButtonMiddle)
    return  ; The button is still, down, so keep waiting.
; Otherwise, the button has been released.
SetTimer, WaitForMiddleButtonUp, off
MouseClick, middle,,, 1, 0, U  ; Release the mouse button.
return

WatchJoystick:
MouseNeedsToBeMoved := false  ; Set default.
SetFormat, float, 03
GetKeyState, joyx, %JoystickNumber%JoyX
GetKeyState, joyy, %JoystickNumber%JoyY
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
{
    SetMouseDelay, -1  ; Makes movement smoother.
    MouseMove, DeltaX * JoyMultiplier, DeltaY * JoyMultiplier * YAxisMultiplier, 0, R
}
return

MouseWheel:
GetKeyState, JoyPOV, %JoystickNumber%JoyPOV
if JoyPOV = -1  ; No angle.
    return
if (JoyPOV > 31500 or JoyPOV < 4500)  ; Forward
    Send {WheelUp}
else if JoyPOV between 13500 and 22500  ; Back
    Send {WheelDown}
return

2 (изменено: Alectric, 2016-08-06 19:45:58)

Re: AHK: Отклонение мыши джойстиком

Gector пишет:

Помогите изменить скрипт,

Проще новый написать...

CoordMode,Mouse,Screen

;x:=a_screenwidth//2
;y:=a_screenheight//2
x:=65535//2
y:=65535//2

loop
{
  if aintwork
  {
    sleep,100
    continue
  }
  sleep,10

  GetKeyState,JoyX,%JoystickNumber%JoyX
  GetKeyState,JoyY,%JoystickNumber%JoyY

  JoyX:=(JoyX-50)*0.02
  JoyY:=(JoyY-50)*0.02

  mx:=round(x+x*JoyX)
  my:=round(y+y*JoyY)

;  tooltip,% a_tickcount "`n" mx "`n" my,mx,my
  if (oldmx!=mx or oldmy!=my)
    DllCall("mouse_event", uint, 0x8001, int, mx, int, my, uint, 0, int, 0)
;    mousemove,mx,my,0

  oldmx:=mx
  oldmy:=my
}
return

f1::
aintwork:=!aintwork
return
Win 7 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

3 (изменено: Gector, 2016-08-06 20:47:16)

Re: AHK: Отклонение мыши джойстиком

Alectric
Огромное спасибо, то что нужно! Только вот как изменить точку курсора и поставить ЛКМ на 1 кнопку джойстика?

4

Re: AHK: Отклонение мыши джойстиком

Gector пишет:

как изменить точку курсора?

Что это значит?

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

5

Re: AHK: Отклонение мыши джойстиком

Alectric
То есть центр, куда будет возвращаться курсор. Переменные x и y?

6 (изменено: Alectric, 2016-08-06 21:14:42)

Re: AHK: Отклонение мыши джойстиком

CoordMode,Mouse,Screen

startx=800 ; центр - куда будет возвращаться курсор
starty=800
x:=300 ; как далеко курсор будет перемещатся от центра
y:=300
;x:=a_screenwidth//2
;y:=a_screenheight//2

loop
{
  if aintwork
  {
    sleep,100
    continue
  }
  sleep,10

  GetKeyState,Bstate,joy1
  if (Bstate="U" and joy1=1)
  {
    joy1=
    send {lbutton Up}
  }

  GetKeyState,JoyX,%JoystickNumber%JoyX
  GetKeyState,JoyY,%JoystickNumber%JoyY

  JoyX:=(JoyX-50)*0.02
  JoyY:=(JoyY-50)*0.02

  mx:=round(startx+x*JoyX)
  my:=round(starty+y*JoyY)

;  tooltip,% a_tickcount "`n" mx "`n" my,mx,my
  if (oldmx!=mx or oldmy!=my)
    mousemove,mx,my,0

  oldmx:=mx
  oldmy:=my
}
return

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

f1::
aintwork:=!aintwork
return
Win 7 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

7

Re: AHK: Отклонение мыши джойстиком

Alectric
Благодарю

8

Re: AHK: Отклонение мыши джойстиком

Если не секрет, зачем такая странная конфигурация?

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

9

Re: AHK: Отклонение мыши джойстиком

Alectric,
То есть конфигурация?

10

Re: AHK: Отклонение мыши джойстиком

Наверное вопрос в том, зачем нужно возвращать назад?

11

Re: AHK: Отклонение мыши джойстиком

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

12

Re: AHK: Отклонение мыши джойстиком

В игре курсор двигается джойстиком, а при переключении на персонаж(от первого лица) наклоны рукоятки джойстика игрой игнорируются. При этом имитация колёсика и назначенных кнопок проходит нормально.
  Можно как-то доработать этот скрипт, чтобы и прицел джойстиком двигался?

13

Re: AHK: Отклонение мыши джойстиком

Оказалось, что в игре не срабатывает MouseMove. Можно это исправить?