【发布时间】: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 有什么问题
标签: c applescript systems-programming hardware-programming