18

我有这个应用程序,我需要在我的应用程序中激活其他应用程序的菜单项(如 Print cmd+p)。现在我正在使用 CGEventPostToPSN() 来完成这项工作,它工作正常,但是当我激活沙盒时,它停止工作。

CGEventPostToPSN(&psn, keyDownEvent);
CFRelease(keyDownEvent);
CGEventPostToPSN(&psn, keyUpEvent);
CFRelease(keyUpEvent);

我现在的问题是当我需要启用沙盒时我该怎么办?我听说过很多有关 Accessibility API 的信息,但我不知道如何激活其他应用程序的菜单项。我很感谢这个问题的任何答案。

费边

4

2 回答 2

4

在沙盒环境中,您仍然可以将 Apple 事件发送到另一个应用程序——您只需为您的应用程序申请“Apple 事件临时例外”。这在“Apple 事件临时异常”部分的 Apple元素键参考中有详细说明。

Apple Event Temporary Exception
当您采用 App Sandbox 时,您的 App 保留以下能力:
● 接收 Apple 事件
● 将 Apple 事件发送给自身
● 响应它收到的 Apple 事件
但是,使用 App Sandbox,您无法将 Apple 事件发送到其他应用程序,除非您配置apple-events 临时异常权利。

对于您要向其发送 Apple 事件的每个应用程序,指定应用程序的捆绑标识符(全部为小写字符)作为此权利键值数组的字符串值。例如,要允许从您的应用程序向 iPhoto 发送 Apple 事件,请使用字符串值 com.apple.iphoto。

Entitlement key Capability
com.apple.security.temporary-exception.apple-events允许将 Apple 事件发送到一个或多个目标应用程序。

据我所知,Apple 没有在这种情况下明确定义“临时”,但一致认为 Apple 目前允许这样做,但未来的某些应用商店或 Mac OS X 更新可能会取消这样做的能力。

请注意,您必须提前明确声明您需要能够向其发送事件的应用程序 - 这不能在运行时由您的应用程序或用户动态选择。

于 2011-11-20T04:07:46.340 回答
2

我仍然没有这个问题的最终答案,但似乎可以使用 @nielsbot 建议的 Accessibility API。

有一些很有前途的功能,例如AXUIElementPostKeyboardEvent()AXUIElementPerformAction()。问题:Apple 的沙盒指南禁止使用 Accessibility API 控制另一个应用程序。

注意:使用 App Sandbox,您可以并且应该启用您的应用程序的可访问性,如本文档中所述。但是,您不能对屏幕阅读器等辅助应用程序进行沙箱处理,也不能对控制另一个应用程序的应用程序进行沙箱处理。

如果你遇到这个问题并且和我有同样的问题,我担心你不走运。重新考虑您是否真的必须控制另一个应用程序,如果是这样,您可能无法在 Mac App Store 上分发您的应用程序,抱歉。

费边

于 2012-09-04T07:40:14.540 回答