0

2か月間試した後、テキストエディットの任意のテキスト範囲(または任意のNSTextView)からAttributedStringを取得する方法を見つけました。私のコードは次のとおりです。

AXUIElementRef systemWideElement = AXUIElementCreateSystemWide();
AXUIElementRef focussedElement = NULL;
AXError error = AXUIElementCopyAttributeValue(systemWideElement,
    kAXFocusedUIElementAttribute, (CFTypeRef*)&focussedElement);
if (error != kAXErrorSuccess) {
    println("Could not get focussed element");
}
else {
    AXValueRef selectedRangeValue = NULL;
    AXError getSelectedRangeError =
        AXUIElementCopyAttributeValue(focussedElement,
        kAXSelectedTextRangeAttribute, (CFTypeRef*)&selectedRangeValue);
    if (getSelectedRangeError == kAXErrorSuccess) {
        CFRange selectedRange;
        AXValueGetValue(selectedRangeValue, kAXValueCFRangeType,
            &selectedRange);
        AXValueRef attributedString = NULL;
        AXError getAttrStrError =
            AXUIElementCopyParameterizedAttributeValue(focussedElement,
            kAXAttributedStringForRangeParameterizedAttribute, selectedRangeValue,
            (CFTypeRef*)&attributedString);
        CFRelease(selectedRangeValue);

        if (getAttrStrError == kAXErrorSuccess)
        {
            CFAttributedStringRef attrStr = (CFAttributedStringRef)attributedString;

            CFTypeRef value = CFAttributedStringGetAttribute(
                attrStr, 0, kAXFontTextAttribute, NULL);

            println("value: %X", value); // value is not NULL, but I can't obtain font name from it.

            CFRelease(attributedString);
        }
        else
        {
            println("Could not get attributed string for selected range");
        }
    }
    else {
        println("Could not get selected range");
    }
}
if (focussedElement != NULL)
    CFRelease(focussedElement);
CFRelease(systemWideElement);

CFAttributedStringRefを正しく取得しました(長さまたはプレーンテキストを取得できます)が、フォント名を取得できません。

ノート:

以下のコードから返される値はNULLではありません。

CFTypeRef value = CFAttributedStringGetAttribute(
                attrStr, 0, kAXFontTextAttribute, NULL);

この値は、CTFontRefまたはCGFontRef、ATSFontRef、...(例外が発生します)と見なすことはできません。

また、kAXFontTextAttributeの代わりにkCTFontAttributeNameを試しますが、NULLを返します。

どうもありがとう。

4

2 に答える 2

1

キーに関連付けられている値は。kAXFontTextAttributeのようCFDictionaryRefです。AXTextAttributedStringのドキュメントを参照してください。

于 2012-07-30T13:46:49.770 に答える
0

これは次の方法で実行できます。

定義

NSFont *newFont;

デフォルトのフォントを指定し、フォントマネージャーが開いたら、選択範囲を選択して、ボタンアクションとそのアウトレットを作成します。

その後、

NSFont*    oldFont = [NSFont fontWithName:@"Times" size:14];
NSFont*    newFont;
newFont = [sender convertFont:oldFont];
NSLog(@">>>>>>>>>>>: %@", newFont.fontName);
于 2016-06-27T12:39:45.793 に答える