Applescript в OS X (macOS) и C низкого уровня (альтернатива Objective-C

Привет, я знаю, что могу использовать что-то вроде Applescript для управления различными аспектами операционных систем, такими как ввод с клавиатуры:

osascript -e 'tell application "System Events" to key code 45'

или щелчки мыши:

osascript -e 'tell app "System Events" to click at {100,200}'

и многие другие функции, такие как увеличение/уменьшение громкости, открытие/закрытие приложения, переход по URL-адресу в веб-браузере.

Теперь я думаю, как бы я мог управлять этим без Applescript в OS X (macOS). Я думаю о каком-то низкоуровневом API, предпочтительно на C (в конечном итоге на Objective-C), который мог бы делать подобные вещи. Меня интересует в основном управление программным обеспечением мыши / клавиатуры / планшета (например, если я буду писать виртуальную клавиатуру), открытие приложений, вызов ярлыков в приложениях. Я думаю, что в конце я буду использовать Applescript и выполнять его сценарии через C. Но меня также интересует более низкоуровневое программирование и библиотеки на C?

Как лучше всего выполнять такие сценарии Apple с других языков, таких как C? Я думаю о чем-то вроде

system(osascript -e 'tell application "System Events" to key code 45')

Но, возможно, есть лучшие функции/библиотеки, такие как osascript("here cmd");


person Michał Ziobro    schedule 18.08.2016    source источник
comment
Забудьте о C для программирования под Mac; все интересное требует Cocoa, так что используйте ObjC. OS X имеет мост событий Apple для ObjC, но это куча дерьма. Самый быстрый, простой и надежный способ — вызвать обработчики AppleScript непосредственно из ObjC через мост AppleScript-ObjC. Для прямого манипулирования графическим интерфейсом используйте API доступности OS X, но избегайте автоматизации графического интерфейса, как чумы, поскольку он смехотворно хрупок и хрупок с ужасной переносимостью. В зависимости от того, что вы делаете, вы можете найти существующее решение, такое как Hammerspoon, лучшим выбором.   -  person foo    schedule 19.08.2016
comment
Но я могу выполнить applescript из C, например system() и т. д.   -  person Michał Ziobro    schedule 19.08.2016
comment
Я думаю, что Objective-C также можно вызывать из C? этот API служб событий Quartz developer.apple.com/library/mac/documentation/Carbon/Reference/   -  person Michał Ziobro    schedule 19.08.2016
comment
Правильным способом выполнения AS из C было бы использование Open Scripting C API, но это все устаревшие/устаревшие API и гигантский PITA, поэтому избегайте его. И для практических целей нет, вы не можете вызывать API-интерфейсы ObjC (Foundation, Cocoa и т. д.) из C. ObjC — это расширенный набор C, который добавляет OO, подобный Smalltalk, поверх процедурного языка C. Честно говоря, зачем вам использовать C, кроме как сделать стержень для собственной спины? В ObjC можно делать все то же, что и в C — вызывать API BSD, вызывать API Carbon C — и также вызывать API ObjC.   -  person foo    schedule 19.08.2016
comment
У меня есть библиотеки на C, и я хотел бы придерживаться C настолько, насколько это возможно. Cocoa или Apple Script будут использоваться только для некоторых системных вызовов, таких как события мыши и клавиатуры. Я попытался скомпилировать программу C в CMake, gcc с -framework ApplicationServices, и она работает корректно и позволяет использовать эти функции Quartz Event Services в C (я думаю, что эти низкоуровневые API-интерфейсы Objective-C являются процедурными и написаны на C в основном поэтому в чем проблема придерживаться C, а не использовать Objective-C, когда в этом нет необходимости   -  person Michał Ziobro    schedule 19.08.2016
comment
1. Вы можете использовать все свои библиотеки C в ObjC. 2. Quartz Event Services — это C API, а не ObjC. 3. Вам нужно взломать книгу по ObjC и научиться ее использовать, чтобы вы могли принимать обоснованные решения для себя.   -  person foo    schedule 19.08.2016


Ответы (1)


Как насчет того, прежде чем перейти от AppleScript к C, я рекомендую сделать промежуточный шаг, используя язык программирования «AppleScript Objective C». Это просто, потому что вы, вероятно, хорошо разбираетесь в applescript, и вы также можете использовать гораздо больший диапазон кода из Objective C. , ЭТО AppleScript в Objective C!! :D Вы можете сделать это в Xcode! надеюсь, это может немного помочь :)

person YeaTheMans    schedule 26.08.2016