Ami*_*Sri 13 cocoa sandbox simulate keystrokes
我需要从我的cooca应用程序向最前面的应用程序发送击键.
我已经有了使用CGEventCreateKeyboardEvent()and的工作代码AXUIElementPostKeyboardEvent(),但它只适用于app不是沙盒的情况.
我已经搜索谷歌相同,但没有找到任何有效的解决方案.
我看到一个Text应用程序和其他几个人在沙盒环境中做同样的事情,所以我想知道,如果有人帮我弄清楚,aText.app和其他人如何能够在沙箱环境中发送击键.
谢谢,
这实际上是可能的。我在这里提供了一个示例应用程序 - GitHub 上的 SendKey
\n\n我选择了简单的方法,从一个简单的 AppleScript 开始:
\n\ndelay 5\n\ntell application "System Events"\n repeat 10 times\n keystroke "#"\n end repeat\nend tell\nRun Code Online (Sandbox Code Playgroud)\n\n脚本中的“延迟”只是给了我足够的时间让文本编辑器成为最前面的应用程序。我建议首先运行这个脚本来看看它的作用。
\n\n然后,我使用默认的应用程序模板创建了一个 Xcode 项目并写道:
\n\n- (void)applicationDidFinishLaunching:(NSNotification *)aNotification\n{\n NSString* scriptPath = [[NSBundle mainBundle] pathForResource:@"sendkey" ofType:@"scpt"];\n NSURL* scriptURL = [NSURL fileURLWithPath:scriptPath];\n NSDictionary* errors;\n NSAppleScript* script = [[NSAppleScript alloc] initWithContentsOfURL:scriptURL error:&errors];\n\n NSLog( @"%@", errors );\n\n [script executeAndReturnError:&errors];\n\n NSLog( @"%@", errors );\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我在没有打开沙箱的情况下对此进行了测试,以验证它是否有效,并且确实如此。然后我打开沙盒,当然,它坏了。但幸运的是,有一种方法可以解决这个问题。目前,Apple 提供了名为com.apple.security.temporary-exception.apple-events 的临时权利。并且,您可以请求授予“com.apple.systemevents”例外。这是我的权利文件的样子:
\n\n<?xml version="1.0" encoding="utf-8"?>\n<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"\n "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0">\n <dict>\n <key>com.apple.security.temporary-exception.apple-events</key>\n <array>\n <string>com.apple.systemevents</string>\n </array>\n <key>com.apple.security.app-sandbox</key>\n <true />\n </dict>\n</plist>\nRun Code Online (Sandbox Code Playgroud)\n\n当我将此权利添加到我的沙盒应用程序并对其进行签名后,它再次按预期工作。
\n\n现在,如果您想发送其他密钥,此问题和解答将演示如何动态构建脚本 -将变量传递给 applescript。
\n\n当然,一旦您完成所有这些工作,您可能可以转向 NSAppleEventDescriptor 和相关类来在代码中构建事件,但我还没有使用该技术。
\n\n请注意,Apple 建议您在使用临时权利时执行以下操作:
\n\n\n\n如果您选择现在不沙箱您的应用程序或使用临时\n 例外权利,请使用 Apple\xe2\x80\x99s 错误报告系统让 Apple\n 了解您遇到的问题。Apple 在开发 OS X 平台时会考虑功能请求。另外,请务必使用 iTunes Connect 中的\n 查看注释字段来解释\n 为何需要例外。
\n