1 (изменено: predator, 2011-05-22 09:21:48)

Тема: AHK: Инверсия мыши по вертикали

Инверсия оси Y реализована практически во всех играх на 3D движке. Но, в игре "ВЕДЬМАК 2" разработчиками не установлена эта функция. По привычке всегда использую инверсию в играх.
Вопрос:
Возможно ли с помощью скрипта выполнить инверсию мыши по оси Y?
(при движении мыши от себя курсор должен перемещатся вниз экрана и при движении к себе вверх)

Увы, на форуме я не нашел информации по данному вопросу.
Буду благодарен за помощь.

2

Re: AHK: Инверсия мыши по вертикали

Вот так, но не факт, что в играх будет работать:

   SetBatchLines, -1
   SetMouseDelay, -1
   CoordMode, Mouse
   OnExit, Exit
   hHookMouse := DllCall("SetWindowsHookEx" . (A_IsUnicode ? "W" : "A")
      , Int, WH_MOUSE_LL := 14
      , Ptr, RegisterCallback("LowLevelMouseProc", "Fast")
      , Ptr, DllCall("GetModuleHandle", UInt, 0, Ptr)
      , UInt, 0, Ptr)
   Return

Exit:
   DllCall("UnhookWindowsHookEx", Ptr, hHookMouse)
   ExitApp
   
Esc:: ExitApp

LowLevelMouseProc(nCode, wParam, lParam)
{
   static y_prev

   if (nCode < 0 || wParam != 0x200)   ; WM_MOUSEMOVE = 0x200
      Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, UInt, wParam, UInt, lParam)

   x := NumGet(lParam+0, "UInt"), y := NumGet(lParam+0, 4, "UInt")
   
   y_prev := y_prev = "" ? y : y_prev
   
   if (y > y_prev || y < y_prev)
   {
      t := y_prev - (y - y_prev)*2
      MouseMove, x, y_prev := t < 2 ? 2 : t > A_ScreenHeight ? A_ScreenHeight : t, 0
   }
   Else
      MouseMove, x, y_prev := y, 0
   Return 1
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

3 (изменено: predator, 2011-05-22 21:02:29)

Re: AHK: Инверсия мыши по вертикали

В самой игре: скрипт работает, но скорость выполнения сильно завышена. При движении по оси Y вверх и вниз - движок игры реагирует рывками, как при завышенной раекции мыши. Снижение на минимальные значения в игре и в системе приемлимого результата не принесло.

В системе (windows 7 x64) все работает на 5 баллов.

4

Re: AHK: Инверсия мыши по вертикали

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

5

Re: AHK: Инверсия мыши по вертикали

Можно ещё так попробовать:

   SetBatchLines, -1
   SetMouseDelay, -1
   CoordMode, Mouse
   OnExit, Exit

   hHook := DllCall("SetWindowsHookEx"
      , Int, WH_MOUSE_LL := 14
      , Int, RegisterCallback("LowLevelMouseProc", "Fast")
      , UInt, DllCall("GetModuleHandle", UInt, 0)
      , UInt, 0)
   Return

Exit:
   DllCall("UnhookWindowsHookEx", UInt, hHook)
   ExitApp

Esc:: ExitApp

LowLevelMouseProc(nCode, wParam, lParam)
{
   static y_prev

   if (nCode < 0 || wParam != 0x200)   ; WM_MOUSEMOVE = 0x200
      Return DllCall("CallNextHookEx", UInt, 0, Int, nCode, UInt, wParam, UInt, lParam)

   x := NumGet(lParam+0), y := NumGet(lParam+0, 4)

   y_prev := y_prev = "" ? y : y_prev

   t := 2*y_prev - y
   MouseMoving(x, y_prev := t < 4 ? 4 : t > A_ScreenHeight ? A_ScreenHeight : t)
   Return 1
}

MouseMoving(x, y)
{
   static MOUSEEVENTF_ABSOLUTE = 0x8000, MOUSEEVENTF_MOVE = 0x1

   DllCall("mouse_event"
    , UInt, MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE
    , Int, Ceil(x*0xFFFF/A_ScreenWidth)
    , Int, Ceil(y*0xFFFF/A_ScreenHeight)
    , UInt, 0)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

6

Re: AHK: Инверсия мыши по вертикали

Увы... Во втором скрипте, при использовании его в системе, при движении по оси Х вправо происходит остановка.
В 3D приложениях работает не корректно. (большая скорость перемещения, перемещения по осям X Y рывками)