Имитация щелчков мышью в Mac OS X не работает для некоторых приложений - PullRequest
7 голосов
/ 03 марта 2010

Я пишу приложение для Mac OS X 10.6 и более поздних версий на C ++. Одна часть приложения должна имитировать движение мыши и щелчки мыши. Я делаю это в настоящее время, публикуя CGEvent объекты, используя CGEventPost(kCGHIDEventTap, event);.

Это работает, по большей части - я могу имитировать движения мыши и щелчки просто отлично, но в некоторых областях это, похоже, не получается. Например:

  • В Mozilla Firefox и Safari я могу нажать на все меню, но не могу щелкнуть ссылку на веб-сайте. Когда я пытаюсь, ссылка подсвечивается, но браузер никогда не переходит по ссылке. Тем не менее, я могу щелкнуть правой кнопкой мыши ссылку, выбрать «открыть ссылку в новой вкладке», и все работает, как ожидалось. Решено - создание события мыши с помощью CGEventCreateMouseEvent(...) заставляет событие работать в веб-браузере.
  • Я могу щелкнуть значок «Панель инструментов», чтобы закрыть панель инструментов, но я не могу нажать кнопку «i» на любом из виджетов панели управления. Аналогично, нажатие на любой из результатов поиска из виджета поиска прожектора также не работает.

Это несоответствие находится за границами приложения. В чем может быть причина?

Ответы [ 4 ]

6 голосов
/ 10 марта 2010

Что вам нужно сделать, чтобы убедить эти приложения в том, что вы фактически сгенерировали щелчок, - это явно установить значение поля «состояние щелчка» для события «вверх» мыши равным 1 (по умолчанию оно равно 0). Следующий код сделает это:

CGEventSetIntegerValueField(event, kCGMouseEventClickState, 1);

Он также должен быть установлен в 1 для мыши, но с использованием CGEventCreateMouseEvent () вместо CGEventCreate (), который будет сделан для вас.

Я проверил это, и оно работает на кнопках 'i' на панели инструментов и в результатах поиска Spotlight.

(Кроме того, если бы вы имитировали двойной щелчок, вам нужно было бы установить состояние щелчка 2 для событий как при нажатии кнопки мыши, так и при нажатии кнопки вверх).

1 голос
/ 08 марта 2010

Большинство меню активируются с помощью события mouseDown. Гиперссылки следуют после события mouseUp. Кнопка «i» работает, только если щелкнуть мышью, но не долгое время. Все это, кажется, показывает, что у вас есть проблема с синхронизацией, попробуйте несколько нажатий.

0 голосов
/ 01 мая 2010

Я написал, как это сделать, в сообщении в блоге. Мышь Python Click and Move на Apple Mac OS X Snow Leopard 10.6.x .

0 голосов
/ 08 марта 2010

Использовать OSXVnc . Я вижу, они используют CGPostMouseEvent() вместо CGPostEvent().

...