在Cocoa中的活动应用程序中获取当前选定的文本

时间:2013-11-14 14:16:59

标签: macos cocoa service accessibility

我有一个状态菜单应用程序,可以使用系统范围的快捷方式启动。当应用程序处于活动状态时,如果我能以某种方式获取当前正在运行的应用程序中选择的文本,那将会很棒。

例如,我在文本编辑器中输入内容,选择文本,点击我的全局快捷方式,我的应用程序出现,我现在想知道文本编辑器中的所选文本。

到目前为止,我所拥有的是(How to get global screen coordinates of currently selected text via Accessibility APIs.采用的代码)

AXUIElementRef systemWideElement = AXUIElementCreateSystemWide();
AXUIElementRef focussedElement = NULL;
AXError error = AXUIElementCopyAttributeValue(systemWideElement, kAXFocusedUIElementAttribute, (CFTypeRef *)&focussedElement);
if (error != kAXErrorSuccess) {
    NSLog(@"Could not get focussed element");
} else {
    AXValueRef selectedTextValue = NULL;
    AXError getSelectedTextError = AXUIElementCopyAttributeValue(focussedElement, kAXSelectedTextAttribute, (CFTypeRef *)&selectedTextValue);
    if (getSelectedTextError == kAXErrorSuccess) {

        selectedText = (__bridge NSString *)(selectedTextValue);
        NSLog(@"%@", selectedText);
    } else {
        NSLog(@"Could not get selected text");
    }
}
if (focussedElement != NULL) CFRelease(focussedElement);
CFRelease(systemWideElement);

这里的问题是它不适用于Safari和Mail等应用程序......

由于

1 个答案:

答案 0 :(得分:1)

从技术上讲,这不是解决您确切问题的方法,因为用户必须从“服务”菜单触发此操作,而不是在触发菜单栏应用时发生这种情况。

您可以使用System Service。您可以为应用创建一项服务,通过粘贴板将当前选定的文本发送到菜单栏应用。