OS X (macOS) 和低级 C(Objective-C 替代方案)中的 Applescript

Posted

技术标签:

【中文标题】OS X (macOS) 和低级 C(Objective-C 替代方案)中的 Applescript【英文标题】:Applescript in OS X (macOS) and low level C (Objective-C alternative 【发布时间】:2016-08-18 16:28:51 【问题描述】:

您好,我知道我可以使用 Applescript 之类的工具来控制操作系统的不同方面,例如键盘输入:

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

或鼠标点击:

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

还有许多其他功能,例如音量增大/减小、打开/关闭应用程序、在网络浏览器中转到 url。

现在我考虑如何在 OS X (macOS) 上没有 Applescript 来控制它。我考虑了一些低级 API,最好是在 C 中(最终在 Objective-C 中)可以做类似的事情。我主要对鼠标/键盘/键盘软件控制(比如如果我要编写虚拟键盘)、打开应用程序、在应用程序中调用快捷方式感兴趣。我想我最后会使用 Applescript 并通过 C 执行它的脚本。但我也对 C 中的更多低级编程和库感兴趣?

从其他语言(如 C)执行此类苹果脚本的最佳方法是什么?我想像

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

但也许有更好的函数/库,比如osascript("here cmd");

【问题讨论】:

忘记 C 用于 Mac 特定的编程;任何有趣的事情都需要 Cocoa,所以使用 ObjC。 OS X 确实有一个用于 ObjC 的 Apple 事件桥,但它是一堆废话。最快、最简单、最可靠的方法是通过 AppleScript-ObjC 桥直接从 ObjC 调用 AppleScript 处理程序。对于直接 GUI 操作,请使用 OS X 的 Accessibility API,但要避免像瘟疫那样的 GUI 自动化,因为它非常脆弱且易碎,可移植性极差。根据您的工作,您可能会发现像 Hammerspoon 这样的现有解决方案是更好的选择。 但我可以像 system() 等从 C 执行 applescript。 我认为 Objective-C 也可以从 C 调用?这个 Quartz 事件服务 API developer.apple.com/library/mac/documentation/Carbon/Reference/… 从 C 执行 AS 的正确方法是使用 Open Scripting C API,但这是所有遗留/不推荐使用的 API 和要使用的巨大 PITA,因此请避免使用它。出于实际目的,不,您不能从 C 调用 ObjC API(Foundation、Cocoa 等)。ObjC 是 C 的超集,它在过程 C 语言之上添加了类似 Smalltalk 的 OO。老实说,你为什么要使用 C,而不是为自己的背部做一根棒子?你可以在 ObjC 中做所有在 C 中可以做的事情 - 调用 BSD API,调用 Carbon C API - 也调用 ObjC API。 我有 C 语言库,我想尽可能地坚持使用 C。 Cocoa 或 Apple Script 将仅用于某些系统调用,如鼠标、键盘事件。我曾尝试在 CMake 中编译 C 程序,使用 -framework ApplicationServices 编译 gcc,它可以正常工作并能够在 C 中使用这个 Quartz 事件服务函数(我认为这个低级 Objective-C API 是程序性的,主要是用 C 编写的坚持使用 C 而不是在不需要时使用 Objective-C 有什么问题 【参考方案1】:

怎么样,在从 AppleScript 升级到 C 之前,我推荐使用“AppleScript Objective C”编程语言的中途步骤,它很简单,因为您可能擅长 applescript,并且您还可以使用更大范围的代码来自目标 C,目标 C 中的 ITS AppleScript! :D 你可以在 Xcode 中做到这一点!希望这可能会有所帮助:)

【讨论】:

以上是关于OS X (macOS) 和低级 C(Objective-C 替代方案)中的 Applescript的主要内容,如果未能解决你的问题,请参考以下文章

sh 如何更改OS X和macOS上的打开文件限制

如何在 C/C++ 中为 macOS 获取产品名称/版本(即获取“Mac OS”和“10.12.5”)

在 OS X 10.11 El Capitan、macOS 10.12 Sierra、macOS 10.13 High Sierra (< 10.13.3) 上安装 pecl 和 pear

Core Data Macos 应用程序和与 OS X 10.7 的兼容性

苹果发布 OS X 继任者 macOS Sierra,到底更新了什么?

历代 Mac OS X / macOS 系统默认墙纸 5K 重制版来了