CGEventPostToPSN()的替代方案,用于在沙盒环境中激活其他应用程序的菜单项?

时间:2011-11-03 10:05:35

标签: macos cocoa background sandbox appstore-sandbox

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

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

我现在的问题是,当我需要启用沙盒时,我该怎么办?我听说过很多关于Accessibility API的内容,但我无法了解如何激活其他应用程序的菜单项。我很感谢你对这个问题的任何答案。

费边

2 个答案:

答案 0 :(得分:4)

在沙盒环境中,您仍然可以将Apple Events发送到另一个应用程序 - 您只需为您的应用申请“Apple Event Temporary Exception”。 Apple的Element Key Reference在“Apple Event Temporary Exception”部分详细介绍了这一点。

  

Apple事件临时例外
  当您采用App Sandbox时,您的应用程序仍保留以下功能:
  ●接收Apple活动
  ●将Apple事件发送给自己   ●回应收到的Apple活动   但是,使用App Sandbox,除非配置apple-events临时例外权利,否则无法将Apple事件发送到其他应用程序。

     

对于要向其发送Apple事件的每个应用,请将所有小写字符的应用包标识符指定为此权利键值数组的字符串值。例如,要启用从应用程序向iPhoto发送Apple事件,请使用字符串值com.apple.iphoto。

     

授权密钥功能
  com.apple.security.temporary-exception.apple-events允许将Apple事件发送到一个或多个目标应用。

据我所知,苹果公司尚未在此背景下明确定义“临时”,但大家一致认为Apple现在正在允许 ,但未来的应用商店或Mac OS X更新可能会删除执行此操作的功能。

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

答案 1 :(得分:2)

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

有一些很有前途的功能,例如AXUIElementPostKeyboardEvent()AXUIElementPerformAction()。问题:Apple的Sandbox指南中禁止使用辅助功能API来控制其他应用程序。

  

注意:使用App Sandbox,您可以并且应该为您的应用启用辅助功能,如本文档中所述。但是,您无法对辅助应用程序(如屏幕阅读器)进行沙盒处理,也无法对控制其他应用程序的应用程序进行沙箱处理。

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

费边