Получение информации о перемещении мыши

acid.ini

Новичок
Пользователь
Ноя 21, 2021
4
0
1
25
Москва
Приветствую!
Я недавно начал изучать язык Python и прошу отнестись с пониманием.
Передо мной стоит задача отслеживания перемещения мыши в ОС семейства Windows 7 и выше.

В поисках решения, я наткнулся на библиотеку pyautogui, которая позволяет получать координаты курсора на рабочем экране. Несложными вычислениями я определяю вектор и его длину, тем самым получаю информацию о направлении и скорости мыши. То, что нужно, НО! в ряде программ, где курсор отсутствует как таковой, отследить движение мыши я не могу. Ниже я привожу пример кода, который позволяет это сделать.

Python:
import pyautogui,time

pyautogui.failsafe = True
#pyautogui.pause = 0.01
pos = (0,0)
posOld = (0,0)

rezk = 200 #Переменная, определяющая предел резкости
#derg = 2 #Переменная, определяющая мощность "мисса"

sch = 0
vec = [0,0]

while 1 == True:
    pos = pyautogui.position() #Определяю первое положение курсора для вычисления вектора
    vec[0] = posOld[0]-pos[0] #Вычисляю первое значение вектора и заножу в список
    vec[1] = posOld[1]-pos[1] #Вычисляю второе значение вектора и заношу в список
    silvec = round((vec[0]**2+(vec[1])**2)**0.5,1) #Вычисляю длину вектора, скорость курсора за 0.1 сек.
#    if (pos[1] > posOld[1] or pos[1] < posOld[1]) or (pos[0] > posOld[0] or pos[0] < posOld[0]):
    if silvec > rezk: #Условие, позволяющее отслеживать скорость курсора
#        x = vec[0]/-(derg)
#        y = vec[1]/-(derg)
#        pyautogui.moveRel(x,y)
#        pyautogui.moveTo(pos[0]+10,pos[1]+10)
        print('BAN NAHUI',sch,silvec) #Скорость превышает значение
        print(posOld,pos,vec)
#        print(x,y)
        sch +=1
    elif silvec > 0:
        print('NE BAN',sch,silvec) #Скорость не превышает значение
        sch +=1
    posOld = pyautogui.position() #Определяю второе положение курсора для вычисления вектора
    time.sleep(0.1) #Интервал времени, определяющий, как часто определять вектор

Собственно, проблема в том, что я не нашел способа получения информации о скорости и направлении мыши другим образом.

Углубленное изучение проблемы, вывело меня на возможность подключения библиотек сторонних языков программирования, которые с легкостью способны получать информацию напрямую с мыши. Но для меня это слишком сложно, писать код на другом, более функциональном языке, что бы внедрить его в Python.

Вопрос:
Возможно ли реализовать получение информации о скорости и направлении мыши (не курсора), используя средства и библиотеки Python?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 672
478
83
НО! в ряде программ, где курсор отсутствует как таковой
это какие программы? консольные?

я не знаю как работает автогуи под капотом, но думаю, через винапи у вас получиться отследить курсор где угодно, так как система всегда реагирует на события мыши...
 
  • Мне нравится
Реакции: acid.ini

acid.ini

Новичок
Пользователь
Ноя 21, 2021
4
0
1
25
Москва
это какие программы?
Такие, как компьютерные игры. Шутеры или платформеры. Курсор отсутствует, pyautogui не может его определить.

через винапи у вас получиться отследить курсор где угодно
Да, довольно мощный инструмент, для работы с ОС. Я был бы признателен, если вы подкинете ссылочки на русскоязычную документацию
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 672
478
83
Да, довольно мощный инструмент, для работы с ОС
ну это как бы API системы...
Я был бы признателен, если вы подкинете ссылочки на русскоязычную документацию
я не знаю таких ссылок, можете сами поискать
 

acid.ini

Новичок
Пользователь
Ноя 21, 2021
4
0
1
25
Москва
через винапи у вас получиться отследить курсор где угодно
Не работает)
По крайней мере функция win32api.GetCursorPos(), которая так же определяет положение курсора, в играх не работает.

Нашел интересную ссылочку по win32api, может кому поможет http://timgolden.me.uk/pywin32-docs/contents.html

Немного больше уточню условия. На данный момент для меня актуальна задача для игры CS:GO. Как только запускается управление персонажем, отслеживание курсора прекращается. Как бы резко я не дергал (у меня условие в коде, определяющее скорость движения, если скорость больше 100к пикселей в секунду, то звучит сигнал), движение мыши не отслеживается. Однако, если в игре нажать tab и вывести курсор, он реагирует.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 672
478
83
вам нужен глобальный курсор
в питоне это так
Python:
import win32gui
import time

while True:
    flags, hCursor, (x, y) = win32gui.GetCursorInfo()
    print(x, y)
    time.sleep(1)


upd
вот не проверил...
все работает...
Python:
import win32api
import time

while True:
    p = win32api.GetCursorPos()
    print(p)
    time.sleep(1)

в игре он всегда в центре...
 
Последнее редактирование:

acid.ini

Новичок
Пользователь
Ноя 21, 2021
4
0
1
25
Москва
но в игре он всегда будет в центре...
Именно, это не решение, увы. Потихоньку понимать начинаю работу с API, что то мне подсказывает, что она не поможет в решении задачи.

UPD
Нашел вот такую статейку https://docs.microsoft.com/en-us/wi...s/taking-advantage-of-high-dpi-mouse-movement
Довольно интересное содержание. Можете помочь разобраться? Как воспользоваться методами получения данных в питоне?
 
Последнее редактирование:

Форум IT Специалистов