通过辅助功能API从其他应用程序的文本字段中获取NSAttributedString?

时间:2012-02-17 23:39:38

标签: objective-c macos cocoa accessibility macos-carbon

我的应用(完全是用户仁慈的)使用辅助功能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 :(得分:0)

How to get global screen coordinates of currently selected text via Accessibility APIs.

此方法使用当前选定的文本来获取所选文本矩形的边界。比通过字体名称/大小计算位置好多了。

棘手的部分是你不能得到一个空选择的边界(也就是一个裸文本插入点插入符号)。因此,您需要解决选择,然后将其传递给选择计算边界矩形的方法。