gpt4 book ai didi

objective-c - 以编程方式将文本输入到任何应用程序中

转载 作者:行者123 更新时间:2023-12-03 16:26:50 27 4
gpt4 key购买 nike

是否有一个概念验证的 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 上运行,最好是面向 future 的(向后兼容性并不重要)。上下文是我将从另一种语言调用 Objective-C 代码。

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

As of Mac OS X 10.7, the low-level Cocoa API (NSAppleEventDescriptor) still lacks essential functionality (e.g. the ability to send Apple events), while the high-level Cocoa API (Scripting Bridge) is too flawed and limited to be a viable foundation for an appscript-style wrapper.

和:

NSAppleScript can safely be used only on the main thread

所以,我的目标是:

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

谢谢!

最佳答案

CoreGraphics 框架中的 CGEvent API 不使用 AppleEvents < https://developer.apple.com/library/mac/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html > 允许您将低级鼠标和键盘事件发布到窗口服务器。

#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);

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

关于objective-c - 以编程方式将文本输入到任何应用程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25858495/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com