Подтвердить что ты не робот

Альтернативы для CGEventPostToPSN() для активации другого пункта меню приложения в изолированной среде?

У меня есть это приложение, где мне нужно активировать другой элемент меню приложения (например, Print cmd + p) из моего приложения. Прямо сейчас я использую CGEventPostToPSN() для выполнения задания, и он работает нормально, но когда я активирую песочницу, он перестает работать.

CGEventPostToPSN(&psn, keyDownEvent);
CFRelease(keyDownEvent);
CGEventPostToPSN(&psn, keyUpEvent);
CFRelease(keyUpEvent);

Теперь мой вопрос - что мне делать, когда мне нужно включить песочницу? Я много слышал о API Accessibility, но мне не удалось узнать, как я могу активировать другой пункт меню приложения. Я благодарен за любой ответ на эту проблему.

Fabian

4b9b3361

Ответ 1

У меня до сих пор нет окончательного ответа на этот вопрос, но, похоже, это возможно с помощью API Accessibility, предложенного @nielsbot.

Есть несколько перспективных функций, таких как AXUIElementPostKeyboardEvent() и AXUIElementPerformAction(). Проблема. Использование API Accessibility для управления другим приложением запрещено в Руководстве Apple Sandbox.

Примечание. С помощью приложения Sandbox вы можете и должны включить ваше приложение для доступности, как описано в этом документе. Тем не менее, вы не можете изолировать вспомогательное приложение, такое как устройство чтения с экрана, и вы не можете изолировать приложение, которое управляет другим приложением.

Если вы столкнулись с этим вопросом и столкнулись с такой же проблемой, как и я, я боюсь, что вам не повезло. Пересмотрите, если вам действительно нужно управлять другим приложением, и если да, возможно, вы не сможете распространять свое приложение в Mac App Store, извините.

Fabian

Ответ 2

В изолированной среде вы все равно можете отправить Apple Events в другое приложение - вам просто нужно подать заявку на "Временное исключение Apple Event" для вашего приложения. Это подробно описано в Apple Element Key Reference в разделе "Временное исключение Apple Event".

Временное исключение Apple Event
Когда вы используете приложение Sandbox, ваше приложение сохраняет возможность: ● Получение событий Apple
● Отправить Apple события для себя
● Ответ на события Apple, которые он получает Тем не менее, с помощью приложения Sandbox вы не можете отправлять события Apple в другие приложения, если вы не настроите права на временные исключения для событий apple-events.

Для каждого приложения, на которое вы хотите отправить события Apple, укажите идентификатор пакета приложений во всех строчных символах в качестве строкового значения для этого массива значений ключей прав. Например, чтобы включить отправку событий Apple в iPhoto из вашего приложения, используйте строковое значение com.apple.iphoto.

Возможность использования ключа права com.apple.security.temporary-exception.apple-events Позволяет отправлять события Apple в одно или несколько целевых приложений.

Насколько мне известно, Apple в этом контексте явно не указала "временные", но консенсус в том, что Apple разрешает это на данный момент, но что некоторое будущее хранилище приложений или обновление Mac OS X могут удалить возможность делать это.

Обратите внимание, что вам нужно явно указать заранее, какие приложения вам нужно отправлять события, - это не может быть динамически выбрано во время выполнения вашим приложением или пользователем.