2

是否有一个概念验证的 Objective-C 可执行文件,它使用 Apple 事件而不是 AppleScript 将一些文本输入到应用程序中,然后单击鼠标?

例如 AppleScript 等价于

tell application "System Events"
 tell process "Safari"
  keystroke "Hello World"
  click
 end tell 
end tell

它应该可以在 Mac OS X 10.9 上运行,最好是面向未来的(向后兼容性无关紧要)。上下文是我将从另一种语言调用 Objective-C 代码。

我这么说是因为我读到了:

从 Mac OS X 10.7 开始,低级 Cocoa API (NSAppleEventDescriptor) 仍然缺乏必要的功能(例如发送 Apple 事件的能力),而高级 Cocoa API(脚本桥)缺陷太大且受限于不可行appscript 样式包装器的基础。

和:

NSAppleScript 只能在主线程上安全使用

所以,我的目标是:

  1. 任何应用程序(按名称或当前)
  2. 任何键盘输入或鼠标
  3. 来自 C 或 Objective-C
  4. 几百毫秒内

谢谢!

4

3 回答 3

3

CoreGraphics 框架中的 CGEvent API 不是使用 AppleEvents,而是您发布低级鼠标和键盘事件到窗口服务器。

#include <CoreGraphics/CoreGraphics.h>

NSArray *launchedApplications = [[NSWorkspace sharedWorkspace] launchedApplications]; // depreciated but I couldn't find a modern way to get the Carbon PSN
NSPredicate *filter = [NSPredicate predicateWithFormat:@"NSApplicationName = \"TextEdit\""];
NSDictionary *appInfo = [[launchedApplications filteredArrayUsingPredicate:filter] firstObject];
ProcessSerialNumber psn;
psn.highLongOfPSN = [[appInfo objectForKey:@"NSApplicationProcessSerialNumberHigh"] unsignedIntValue];
psn.lowLongOfPSN = [[appInfo objectForKey:@"NSApplicationProcessSerialNumberLow"] unsignedIntValue];

CGEventRef event1 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)6, true); // 'z' key down
CGEventRef event2 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)6, false); // 'z' key up

CGEventPostToPSN(&psn, event1);
CGEventPostToPSN(&psn, event2);

你也可以考虑写一个 Service < https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/SysServices/introduction.html >,它可以让你通过应用程序中的Service菜单向其他应用程序提供功能菜单。请注意,您甚至可以为服务菜单项分配键盘快捷键。服务通过系统粘贴板工作;如果您只需要能够将一些罐装或生成的数据粘贴到另一个应用程序中,这种方法可能比处理原始窗口服务器事件更容易。

于 2014-09-21T20:54:37.250 回答
1

实现结果的最佳方法是使用 Automator,

请参阅 https://developer.apple.com/library/mac/documentation/AppleApplications/Conceptual/AutomatorConcepts/AutomatorConcepts.pdf

如果你想通过ObjectiveC来实现这一点,你需要了解“分布式对象架构”。通过配对 NSPort 和 NSInvocation,你可以做一些很棒的事情,比如跨进程和跨机器的方法调用。

这是该指南
https://developer.apple.com/librarY/prerelease/mac/documentation/Cocoa/Conceptual/DistrObjects/Concepts/architecture.html

于 2014-09-21T11:19:29.820 回答
0

我不确定这是否是您要查找的内容,但您可能对设置 NSInvocation 对象感兴趣:

- (void)invokeWithTarget:(id)anObject

如果您希望运行一些代码并“模拟”一个 UX 环境,那么保存调用并运行它可能很有价值。

(自动机?)

于 2014-09-18T20:18:11.477 回答