Вызывать функции другой программы? - PullRequest
3 голосов
/ 15 мая 2009

Итак, у меня есть эта программа, которая мне действительно нравится, и она не поддерживает Applescript. Я хотел бы немного автоматизировать это. Теперь я знаю, что мог бы использовать яблочный скрипт, чтобы программа сказала меню, чтобы подменю сообщило пункту меню активировать или что-то в этом роде, но, честно говоря, я все равно не очень люблю appleScript.

Когда я открываю файл NIB в IB, я вижу сообщения, которые отправляются в FirstResponder; например, пункт меню «Копировать» отправляет «copy:». Можно ли как-нибудь вызвать это напрямую из другой программы?

Ответы [ 3 ]

2 голосов
/ 15 мая 2009

Нет. Знаете, это называется защищенной памятью. Другая программа полностью изолирована от вашего приложения. Есть способы поместить код в другие приложения, но (а) он очень нежелателен (б) требует привилегий root, что означает, что остальная часть вашего приложения должна быть ROCK SOLID AND IMPREGNABLE, и (в) написание такого кода является черным искусством требуется знание интерфейсов ядра операционной системы, управления виртуальной памятью, ABI, внутренних компонентов компоновщика / загрузчика, программирования на ассемблере, а также рабочих параметров и других особенностей конкретного процессора, на котором работает ваше приложение.

Действительно, AppleEvents и другие подобные механизмы IPC существуют по причине.

Ваши другие альтернативы (честно говоря, все они немного странные и дают вам довольно значительную нагрузку, гарантируя, что целевое приложение находится в том состоянии, в котором вы хотите / ожидаете), доступ к данным, которые вы ищете :

  1. API-интерфейсы специальных возможностей из платформы ApplicationServices, с помощью которых вы можете перемещаться по дереву пользовательского интерфейса для извлечения текста из любого места, где он вам нужен, или можете активировать пункт меню. Однако доступ к вашему приложению должен быть явно предоставлен пользователем (хотя это во многом совпадает с требованием для сценариев пользовательского интерфейса).
  2. Вы можете использовать API-интерфейсы CoreGraphics (снова в рамках ApplicationServices), чтобы напрямую отправлять события клавиатуры целевому приложению (или просто системе). Это будет означать отправку четырех событий: Command-down, C-down, C-up, Command-up.

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

1 голос
/ 05 октября 2011

Вас может заинтересовать SIMBL или mach_inject . SIMBL - это демон (в моем форке, основанном на mach_inject, в оригинальной версии, основанной на внедрении с помощью некоторого хака ScriptingAdditions), который выполняет внедрение для вас, поэтому вам просто нужно поместить пакет с вашим кодом в каталог SIMBL, и SIMBL будет внедрять это для вас в целевое приложение. Или вы можете сделать это самостоятельно через mach_inject. Или, возможно, более удобный, mach_inject_framework, который внедряет и запускает код, который просто загружает некоторый фреймворк.

0 голосов
/ 15 мая 2009

Я думаю, что Джим может немного преувеличивать точку зрения; он не ошибается, но это вводит в заблуждение. Есть много способов заставить программу Какао выполнять свой собственный код под вашим контролем (Carbon сложнее). Accessibility API очень часто используется таким образом (настолько часто, что я ожидаю, что он в конечном итоге будет переназначен). Fscript может предоставить вам все виды доступа к внутренностям другой программы Какао. Хотя Менеджеры ввода в какой-то момент вполне могут покинуть сцену, SIMBL все еще существует сегодня, чтобы делать подобные вещи.

Нравится ли вам Applescript или нет, Apple Events - это основной способ, которым Apple обеспечивает межпрограммное управление. Вы дважды проверили функцию Open Library редактора скриптов, чтобы выяснить, действительно ли программа поддерживает Applescript? Вы можете кодировать события Apple целиком в Objective-C в эти дни, используя Leopard Scripting Bridge. Я написал учебник , если хотите (он все еще недостаточно документирован Apple).

Какао - мечта обратного инженера. Те же самые ребята, которые ведут SIMBL, имеют хорошее введение в тему . «Волк» также пишет много полезной информации об этом.

Джим прав. Многие из этих подходов могут полностью дестабилизировать систему, если они сделаны неправильно (иногда даже если все сделано правильно). Я не делаю большую часть этого материала в своих производственных системах; Мне нужно, чтобы они работали. Но есть много вещей, которые вы можете заставить приложение Mac делать, и это хорошая часть обучения для разработчиков Mac, чтобы понять, как все части работают на самом деле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...