Objective c 在另一个应用程序中拦截文本输入的API?

Objective c 在另一个应用程序中拦截文本输入的API?,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我想制作一个类似于TextExpander的应用程序,但我不确定你会如何截取文本。据我所知,我需要从非可访问性开始。有谁能分享一些片段,或者至少给我指出正确的方向吗?编辑:无需担心。你问的是Mac OS。我以为你在问iOS 你应该看看。目标应用程序必须通过使TE提供的对象成为文本字段的委托来构建对TE的支持。你不能在其他人的应用程序中运行你的代码。他们必须将你的代码编译到他们的应用程序中。这就是为什么有一个TextExpander SDK 一旦TextExpander代码出现在目标应用程序中,文

我想制作一个类似于TextExpander的应用程序,但我不确定你会如何截取文本。据我所知,我需要从非可访问性开始。有谁能分享一些片段,或者至少给我指出正确的方向吗?

编辑:无需担心。你问的是Mac OS。我以为你在问iOS

你应该看看。目标应用程序必须通过使TE提供的对象成为文本字段的委托来构建对TE的支持。你不能在其他人的应用程序中运行你的代码。他们必须将你的代码编译到他们的应用程序中。这就是为什么有一个TextExpander SDK


一旦TextExpander代码出现在目标应用程序中,文本字段代理将通过查找放入应用程序中的代码段来获取共享代码段。

首先,您应该知道,由于沙箱要求,如果您想在应用程序商店中销售应用程序,这根本不可能实现

如果您不打算对应用程序进行沙箱处理,可以使用
NSEvent
类方法
addGlobalMonitorForEventsMatchingMask:
创建一个全局键事件处理程序,当在其他应用程序中按下键时调用该处理程序(但不是您自己的应用程序,请使用
addLocalMonitor…

要实际插入代码段,如TextExpander,有几种方法。您可以使用辅助功能API,但这要求您针对的应用程序支持辅助功能,但情况并非总是如此


另一种选择是使用提供(除其他外)低级方法来模拟关键事件。

“要求您针对的应用程序支持可访问性”并不是一个高要求的FWIW。如果他们不使用自定义类,而是使用NSTextField和friends,则内置了可访问性。不久前,我在一个小臭鼬工厂的项目中尝试过这个。该框架使工作更容易探测可访问性对象的层次结构。Quartz事件服务也是一种观察按键的好方法,无需启用辅助设备的访问。不过,要做到这一点,您必须以root权限运行(一个小的helper进程)来获取密钥事件。