Получить NSAttributedString из текстового поля другого приложения через API доступности? - PullRequest
1 голос
/ 18 февраля 2012

Мое приложение (исключительно удобное для пользователя) использует API-интерфейсы специальных возможностей для захвата содержимого текстовых полей, принадлежащих другим приложениям.

Я пользуюсь превосходным Инспектором Доступности от Apple для помощи и вдохновения

https://developer.apple.com/library/mac/#documentation/Accessibility/Conceptual/AccessibilityMacOSX/OSXAXTesting/OSXAXTestingApps.html

Я включил класс UIElementUtilities этого проекта, который я могу использовать для следующих действий:

//Get focused App
AXUIElementRef frontMostApp;
frontMostApp = getFrontMostApp();

//Get focused UIElement (Such as a textfield)
AXUIElementRef focusedUIElement;
AXUIElementCopyAttributeValue(frontMostApp, kAXFocusedUIElementAttribute, (CFTypeRef *)&focusedUIElement);

NSString *textfieldContents = [UIElementUtilities descriptionForUIElement:focusedUIElement attribute:(NSString *)kAXValueAttribute beingVerbose:NO];
//descriptionForUIElement:attribute:beingVerbose uses `AXUIElementCopyAttributeValue`


NSLog(@"TEXT FIELD CONTENTS: %@", textfieldContents);

Таким образом, я могу получить kAXValueAttribute (он же текстовое содержимое текстового поля приложения) в виде открытого текста NSString.

Есть ли способ сделать то же самое, но получить NSAttributedString? Мне нужно вытащить имя шрифта и размер шрифта, который в настоящее время используется в текстовом поле.

Конечная цель - использовать имя шрифта и размер шрифта для расчета положения каретки в текстовом поле. (Я уже могу это сделать, учитывая имя / размер шрифта). Но если есть лучший способ рассчитать положение каретки, это был бы предпочтительный ответ. В этом случае мне не нужно получать NSAttributedString.

1 Ответ

0 голосов
/ 23 февраля 2012

Как получить глобальные экранные координаты выделенного в данный момент текста с помощью API специальных возможностей.

Этот метод использует выбранный в данный момент текст, чтобы получить границы выделенного текстового прямоугольника. Гораздо лучше, чем вычислять позицию по имени / размеру шрифта.

Хитрость в том, что вы не можете получить границы для пустого выделения (так называемый каркас точки вставки текста). Таким образом, вам нужно создать выделение, а затем передать его в метод, который вычисляет ограничивающий прямоугольник.

...