CGEventPost не всегда перемещает мышь macOS

У меня возникли проблемы при попытке программного перемещения мыши в macOS Sierra с помощью Quartz Event Services в среде Python.

Например:

Когда я запускаю этот скрипт:

from Quartz.CoreGraphics import CGEventCreateMouseEvent
from Quartz.CoreGraphics import CGEventPost
from Quartz.CoreGraphics import kCGMouseButtonLeft
from Quartz.CoreGraphics import kCGEventMouseMoved
from Quartz.CoreGraphics import kCGHIDEventTap


def MouseMove(x, y):
        event = CGEventCreateMouseEvent(None, kCGEventMouseMoved, (x, y), kCGMouseButtonLeft)
        CGEventPost(kCGHIDEventTap, event)

MouseMove(100, 100)

Все работает отлично, и мышь перемещается на (x: 100, y: 100).

ОДНАКО по какой-то причине эта процедура не перемещает мышь в некоторых приложениях. В частности, в моем случае мой MacBook работает под управлением Call of Duty: Modern Warfare 2 на Steam и перемещение мыши таким образом не регистрируется в этом приложении, но, что интересно, я все еще могу сгенерировать мышь щелкает в приложении, используя CGEventPost, но не движения мыши.

Итак, я провел небольшое исследование, чтобы попытаться выяснить, почему это происходит, и самое близкое, что я смог найти в Интернете, касающееся моей проблемы, - это этот вопрос на SO, и я упоминаю об этом потому, что мне интересно, нравится ли это в связанном вопросе Мне нужно вызвать метод, похожий на что-то вроде CGEventSetIntegerValueField, только вместо обновления kCGMouseEventClickState update события мыши, относящегося к движению мыши, чтобы приложение знало, что мышь действительно переместилась. Однако я не нашел такого метода в документации CGEventField, и я просто чувствую, что я что-то упускаю, или, может быть, это даже не связано с проблемой, но это единственное зацепление, которое я смог найти.

Пожалуйста помоги. Буду признателен за любые предложения.


person Garret Kaye    schedule 25.07.2017    source источник


Ответы (1)


Я нашел ответ.

Я изменил эту строку:

event = CGEventCreateMouseEvent(None, type, (x, y), kCGMouseButtonLeft)
CGEventPost(kCGHIDEventTap, event)

К этому:

CGPostMouseEvent((x, y), True, 0, False)

И, конечно, импортировано: CGPostMouseEvent

В результате перемещение мыши работает везде и во всех приложениях. Причина, по которой это работает, заключается в том, что оказывается, что CGPostMouseEvent происходит на более глубоком уровне локальной машины, чем CGEventPost.

person Garret Kaye    schedule 26.07.2017
comment
Спасибо за ответ. Я столкнулся с той же проблемой при использовании Unity. Эта проблема воспроизводится со всеми следующими модулями: pynput, pyautogui и autopy. В источнике этих модулей все они полагаются на CGEventCreateMouseEvent, который предотвращает навигацию в трехмерных видовых экранах. На сегодняшний день CGPostMouseEvent помечен как устаревший. Есть ли другой способ обновления положения мыши в 3D Viewport, который не является устаревшим? - person Diego Trazzi; 11.08.2020