加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 如何通过Accessibility API获取当前所选文本的全

发布时间:2020-12-16 05:30:27 所属栏目:百科 来源:网络整理
导读:我需要帮助找出,如何在任何应用程序上按下CMD CTRL D,Dictionary应用程序如何显示以下弹出对话框中的所选文本.我想实现 与我的可可应用程序相同的功能,我的应用程序将在后台运行,并显示所选文本的某些热键按键的建议. 我已经实现了热键捕获,我只需要有代码来
我需要帮助找出,如何在任何应用程序上按下CMD CTRL D,Dictionary应用程序如何显示以下弹出对话框中的所选文本.我想实现
与我的可可应用程序相同的功能,我的应用程序将在后台运行,并显示所选文本的某些热键按键的建议.

我已经实现了热键捕获,我只需要有代码来获得屏幕上所选文本的矩形区域,所以我可以显示对话框,如字典应用程序.

谢谢

解决方法

您可以使用可访问性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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读