如何通过可访问性API获取当前选定文本的全局屏幕坐标。

问题描述 投票:13回答:3

我需要帮助才能找到,在任何应用程序上按CMD + CTRL + D时,词典应用程序如何显示以下弹出对话框以显示选定的文本。我要实施我的可可粉应用程序具有相同的功能,其中我的应用程序将在后台运行,并在某些热键按下时为所选文本显示建议。

“字典应用程序热键建议对话框”

我已经实现了热键捕获,我只需要有代码就可以在屏幕上获取所选文本的矩形区域,因此我可以显示类似字典应用程序的对话框。

谢谢

objective-c cocoa screen accessibility selectedtext
3个回答
17
投票

您可以为此使用可访问性API。确保已选中“启用辅助设备的访问”设置(在“系统偏好设置” /“通用访问”中)。

以下代码片段将确定大多数应用程序中所选文本的边界(以屏幕坐标为单位)。不幸的是,它在Mail和Safari中不起作用,因为它们使用私有可访问性属性。也可以使它在那里工作,但是它需要更多工作,并且可能需要私有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 selectedRangeValue = NULL;
    AXError getSelectedRangeError = AXUIElementCopyAttributeValue(focussedElement, kAXSelectedTextRangeAttribute, (CFTypeRef *)&selectedRangeValue);
    if (getSelectedRangeError == kAXErrorSuccess) {
        CFRange selectedRange;
        AXValueGetValue(selectedRangeValue, kAXValueCFRangeType, &selectedRange);
        AXValueRef selectionBoundsValue = NULL;
        AXError getSelectionBoundsError = AXUIElementCopyParameterizedAttributeValue(focussedElement, kAXBoundsForRangeParameterizedAttribute, selectedRangeValue, (CFTypeRef *)&selectionBoundsValue);
        CFRelease(selectedRangeValue);
        if (getSelectionBoundsError == kAXErrorSuccess) {
            CGRect selectionBounds;
            AXValueGetValue(selectionBoundsValue, kAXValueCGRectType, &selectionBounds);
            NSLog(@"Selection bounds: %@", NSStringFromRect(NSRectFromCGRect(selectionBounds)));
        } else {
            NSLog(@"Could not get bounds for selected range");
        }
        if (selectionBoundsValue != NULL) CFRelease(selectionBoundsValue);
    } else {
        NSLog(@"Could not get selected range");
    }
}
if (focussedElement != NULL) CFRelease(focussedElement);
CFRelease(systemWideElement);

0
投票

您正在寻找的是服务。使用服务,您的应用程序甚至不必运行或捕获全局热键。

例如,您描述的字典应用程序的功能实际上是一项服务,可以在服务菜单中观察到。

“字典服务菜单”“>

Apple的Service Implementation Guide可能是有关服务的最佳信息。


0
投票

您在这里寻求Swift中的@omz答案

© www.soinside.com 2019 - 2024. All rights reserved.