Получить выделенный текст в активном приложении в Cocoa

У меня есть приложение меню состояния, которое можно запустить, используя ярлык в системе. Когда приложение активируется, было бы здорово, если бы я мог каким-то образом получить текст, который выбран в текущем запуске приложения.

Итак, например, я печатаю что-то в своем текстовом редакторе, выбираю текст, ударяю по моему глобальному ярлыку, прихожу к моему приложению, и теперь мне будет интересно узнать выделенный текст из текстового редактора.

До сих пор я получил следующее (принятый код из Как получить глобальные экранные координаты текущего выделенного текста через API-интерфейсы доступности.)

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

Это не является технически решением для вашего точного вопроса, потому что пользователь должен будет вызвать это из меню "Службы", а не просто, когда он запускает ваше приложение в строке меню.

Вы можете использовать System Service. Вы создаете службу для своего приложения, которая отправляет выбранный текст в приложение панели меню через Pasteboard.