Моделирование щелчков мышью по Mac OS X не работает на некоторые приложения

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

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

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

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

7
задан Peter Mortensen 10 March 2010 в 00:14
поделиться

4 ответа

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

CGEventSetIntegerValueField(event, kCGMouseEventClickState, 1);

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

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

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

.
6
ответ дан 7 December 2019 в 07:44
поделиться

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

0
ответ дан 7 December 2019 в 07:44
поделиться

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

1
ответ дан 7 December 2019 в 07:44
поделиться

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

0
ответ дан 7 December 2019 в 07:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: