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); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |