在沙盒环境中激活另一个应用程序菜单项的CGEventPostToPSN()替代方案是什么?

18

我有一个应用程序,需要在我的应用程序中激活另一个应用程序的菜单项(例如打印cmd + p)。目前,我正在使用CGEventPostToPSN()来完成此任务,它运行良好,但是当我启用沙盒时,它就停止工作了。

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

我的问题是,当我需要启用沙盒时该怎么办?我听说过无障碍API,但我无法找到如何激活其他应用程序的菜单项。非常感谢任何关于这个问题的答案。

Fabian


当我看到“状态项”时,我以为你指的是NSStatusItem,但“打印”只是一个普通的菜单项。 - JWWalker
1
如果您需要与其他应用程序通信,您不应启用沙盒。我怀疑苹果公司是否会批准需要用户启用辅助功能API才能使您的应用程序正常工作的应用程序。目前,您可以做的最好的事情是向苹果公司提交一个功能请求,其中描述您试图解决的问题。 - Kentzo
1
问题在于,从2012年3月1日开始,苹果要求实行沙箱机制。我已经提交了一个功能请求,但希望知道是否有其他方法可以代替我的思路。(比如使用苹果事件,在临时例外的情况下是可行的。) - Fabian Kreiser
2个回答

4
在沙盒环境中,您仍然可以向另一个应用程序发送Apple事件,只需要为您的应用程序申请“Apple事件临时例外”。这在苹果的Element Key Reference的“Apple事件临时例外”部分有详细说明。

Apple事件临时例外
当您采用App Sandbox时,您的应用程序仍保留以下功能:
● 接收Apple事件
● 向自身发送Apple事件
● 响应其接收到的Apple事件
但是,在App Sandbox下,您无法将Apple事件发送到其他应用程序,除非您配置了apple-events临时例外权利。

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

权利键Capability
com.apple.security.temporary-exception.apple-events 启用向一个或多个目标应用程序发送Apple事件。

据我所知,苹果在这个上下文中并没有明确定义“临时”,但共识是苹果目前允许这样做,但未来的应用商店或Mac OS X更新可能会取消这种能力。请注意,您必须事先明确声明需要能够向其发送事件的应用程序 - 您的应用程序或用户无法在运行时动态选择。

我知道那个临时异常,它可以在我的应用程序中使用。你知道我怎么能够通过苹果事件激活另一个应用程序中的菜单项吗? - Fabian Kreiser
@FabianKreiser,我认为没有通用的方法可以使用Apple Events调用菜单项。当然,如果你正在编写发送方应用程序和接收方应用程序,你可以设计任何想要的AppleEvent协议。 - JWWalker
1
@FabianKreiser,你真的需要操作菜单项吗?难道你不能发送“'pdoc'”(kCoreEventClasskAEPrintDocuments)事件吗? - Ken Thomases
@KenThomases 那将是一个完美的解决方案。不幸的是,我想要激活一个保存菜单项(而不是打印),并且不存在任何kAESaveDocument常量。但还是谢谢你。 :) - Fabian Kreiser
1
有没有像“打开第二个菜单”、“选择第三个项目”等辅助功能程序? - nielsbot

2
我对这个问题仍然没有最终答案,但根据@nielsbot的建议,使用辅助功能API似乎是可能的。
有一些有前途的函数,如AXUIElementPostKeyboardEvent()AXUIElementPerformAction()。问题在于,使用辅助功能API控制另一个应用程序在苹果的沙盒指南中是被禁止的。

注意:使用App Sandbox,您可以并且应该为辅助功能启用您的应用程序,如本文档所述。但是,您不能将辅助应用程序(例如屏幕阅读器)和控制另一个应用程序的应用程序沙箱化。

如果您遇到了这个问题,并且与我有相同的问题,那么恐怕您运气不佳。请重新考虑是否真的需要控制另一个应用程序,如果是,则可能无法在Mac App Store上分发您的应用程序,抱歉。
法比安

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接