Python

Перемещение мыши с абсолютной оси в относительную

на языке python столкнулся с проблемой в играх при применении библиотек для автоматизации мыши. Некоторые не работают, работают лишь две библиотеки это pydirectinput и win32. Проблема в том, что перемещение в играх персонажа происходит с относительными координатами. Нужна помощь в написании алгоритма или ссылку на источник решения проблемы. Благодарю Заранее
А зачем использовать библиотеки, когда есть winapi mouse_event функция, например. Вот псевдокод рабочий на ahk.

 F1::  
CoordMode,Mouse,Screen
DllCall("mouse_event", "UInt", 0x8001, "UInt", 25535, "UInt", 25535)
Return
Александр Немков
Александр Немков
11 339
Лучший ответ
Бенько Анатолий а как его использовать? подскажи если не сложно. Все таки с формулами не дает правильного результата
Александр Немков Ну 0x8001 параметр отвечает за перемещения мыши. 0x8001 - абсолютный, 0x0001 - относительный. Там по справке читаешь, например, если написано MOUSEEVENTF_LEFTDOWN
0x0002 то пишешь так в абсолютных координатах и т.д. 0x8002 - левая кнопка нажата 0x8004 - левая кнопка отпущена и т.д.
Бенько Анатолий спасибо, пробую
Бенько Анатолий я пытался все, не работает нормально ничего. в игре работает ли две библиотеки это win32api pydirect
Александр Немков и координаты наверное для относительных другие будут
Александр Немков может параметров больше нужно, на ахк так для относительных

DllCall("mouse_event", uint, 1, int, -11, int, -22, uint, 0, int, 0)
Нужно самому переводить координаты между нужными системами

допустим, загнали окно игры в самый верх экрана
x_init=0
y_init=32 (заголовок окна)

допустим, игра - сетка 16 х 12 из элементов по 10 пикселей
тогда относительные координаты в абсолютные переводятся легко

def setcoords(X,Y):
global x,y
x=X*10+x_init
y=Y*10+y_init

на входе - координаты сетки (0:15 и 0:11), на выходе (x,y) - целевые координаты курсора

но, насколько я понял, нужно не относительное переставление курсора, а его перемещение (скорее всего, еще и с зажатой ЛКМ). Это можно сделать точно также, только вместо "нулевых" координат окна нужно взять предыдущие координаты курсора:

def relcoords(X,Y):
global x,y
x+=X*10
y+=Y*10

в этом случае число ячеек может быть не только положительным (вправо и вниз), но и отрицательным - это движение вверх и влево

(Внимание! дальше ПСЕВДОКОД) я не работал с этими библиотеками, поэтому не знаю, какие функции используются там на самом деле, но пример привести нужно.

Пример - перетаскивание из ячейки (3,5) на 1 вправо и 3 вверх:

x=x_init=0
y=y_init=32

def relcoords(X,Y):
global x,y
x+=X*10
y+=Y*10

relcoords(3,5)
mouse.move(x,y) #заменить на настоящую функцию перемещения курсора
relcoords(1,-3)
mouse.down() #заменить на настоящую функцию "зажать кнопку"
mouse.move(x,y) #заменить на настоящую функцию перемещения курсора
mouse.up() #заменить на настоящую функцию "отпустить кнопку"

как-то так
Бенько Анатолий Спасибо, вчера 13 часов мучился.Значит я правильную формулу использовал. Только не доводил до конца. Сделаю сегодня значит