Программное получение имени выбранного текстового шрифта в TextEdit

Можно ли получить имя шрифта выделенного текста в TextEdit (с помощью ObjC или Carbon)? Я попробовал этот код, но «значение» равно нулю:

AXUIElementRef systemWideElement = AXUIElementCreateSystemWide();
AXUIElementRef focussedElement = NULL;
AXError error = AXUIElementCopyAttributeValue(systemWideElement,
    kAXFocusedUIElementAttribute, (CFTypeRef*)&focussedElement);
CFTypeRef value;
AXUIElementCopyAttributeValue(focussedElement, kAXFontTextAttribute, &value);

Спасибо.


person mh taqia    schedule 08.05.2012    source источник
comment
Каково значение focussedElement после возврата AXUIElementCopyAttributeValue?   -  person Peter Hosey    schedule 08.05.2012
comment
Значение focussedElement после возврата AXUIElementCopyAttributeValue является допустимым (не пустым).   -  person mh taqia    schedule 08.05.2012


Ответы (1)


Обратите внимание, что kAXFontTextAttribute объявлено в AXTextAttributedString.h. Это не атрибут элементов пользовательского интерфейса; это атрибут текста в атрибутированной строке.

Вместо этого попробуйте kAXAttributedStringForRangeParameterizedAttribute, передав значение, которое вы получили для kAXSelectedTextRangeAttribute. (Это предполагает, что сфокусированный элемент пользовательского интерфейса является AXTextArea. Вы не должны предполагать это.) Это вернет AXTextAttributedString, из которого вы можете получить словарь шрифтов по атрибуту kAXFontTextAttribute.

person Peter Hosey    schedule 08.05.2012
comment
Спасибо, это работает, но я не знаю, как получить имя шрифта из возвращаемого значения. можешь мне помочь? - person mh taqia; 08.05.2012
comment
@mhtaqia: из атрибутивной строки или словаря шрифтов? - person Peter Hosey; 09.05.2012
comment
Я пробовал это: CFAttributedStringRef attr_str; AXUIElementCopyAttributeValue(focussedElement, kAXAttributedStringForRangeParameterizedAttribute, (CFTypeRef*)&attr_str); attr_str возвращается (не нуль), и я пытаюсь получить длину с помощью CFAttributedStringGetLength(attr_str), но произошла ошибка, также пробовал CFDictionaryRef dic = CFAttributedStringGetAttributes(attr_str, 0, NULL) и произошла ошибка, кажется, что attr_str не является AttributedString тип? я использую неправильный метод? - person mh taqia; 09.05.2012
comment
@mhtaqia: поскольку это параметризованный атрибут, вам нужно использовать другую функцию, чтобы получить строку с атрибутом: AXUIElementCopyParameterizedAttributeValue. - person Peter Hosey; 09.05.2012
comment
Я попробовал UIBrowser, эта программа показывает, что AttributedString пуст; Кажется, TextEdit не реализует AttributedString. Однако спасибо Петру. - person mh taqia; 09.05.2012
comment
@mhtaqia: TextEdit использует NSTextView, который должен его поддерживать — я был бы удивлен, если бы это было не так. Убедитесь, что вы передаете диапазон, находящийся внутри текста и покрывающий хотя бы один символ — пустой диапазон (нулевая длина) даст пустую строку. - person Peter Hosey; 09.05.2012
comment
Эй, я знаю, что уже поздно, но @PeterHosey, все, что ты сказал, работает. Мне удалось получить nsattributedstring из выбранного диапазона и даже преобразовать его в html. - person hugo411; 01.06.2018