我需要帮助来了解字典应用程序如何在任何应用程序上按 CMD+CTRL+D 时显示所选文本的以下弹出对话框。我想为我的可可应用程序实现相同的功能,我的应用程序将在后台运行,并在某些热键上显示所选文本的建议。
我已经实现了热键捕获,我只需要有代码来获取屏幕上选定文本的矩形区域,这样我就可以像字典应用程序一样显示对话框。
谢谢
我需要帮助来了解字典应用程序如何在任何应用程序上按 CMD+CTRL+D 时显示所选文本的以下弹出对话框。我想为我的可可应用程序实现相同的功能,我的应用程序将在后台运行,并在某些热键上显示所选文本的建议。
我已经实现了热键捕获,我只需要有代码来获取屏幕上选定文本的矩形区域,这样我就可以像字典应用程序一样显示对话框。
谢谢
您可以为此使用可访问性 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);
在这里,您可以在 Swift 中找到 @omz 答案
let systemWideElement = AXUIElementCreateSystemWide()
var focusedElement : AnyObject?
let error = AXUIElementCopyAttributeValue(systemWideElement, kAXFocusedUIElementAttribute as CFString, &focusedElement)
if (error != .success){
print("Couldn't get the focused element. Probably a webkit application")
} else {
var selectedRangeValue : AnyObject?
let selectedRangeError = AXUIElementCopyAttributeValue(focusedElement as! AXUIElement, kAXSelectedTextRangeAttribute as CFString, &selectedRangeValue)
if (selectedRangeError == .success){
var selectedRange : CFRange?
AXValueGetValue(selectedRangeValue as! AXValue, AXValueType(rawValue: kAXValueCFRangeType)!, &selectedRange)
var selectRect = CGRect()
var selectBounds : AnyObject?
let selectedBoundsError = AXUIElementCopyParameterizedAttributeValue(focusedElement as! AXUIElement, kAXBoundsForRangeParameterizedAttribute as CFString, selectedRangeValue!, &selectBounds)
if (selectedBoundsError == .success){
AXValueGetValue(selectBounds as! AXValue, .cgRect, &selectRect)
//do whatever you want with your selectRect
print(selectRect)
}
}
}
您正在寻找的是一项服务。 使用服务,您的应用甚至不必运行或捕获全局热键。
例如,您描述的词典应用程序的功能实际上是一项服务,可在“服务”菜单中观察到。
Apple 的服务实施指南可能是有关服务的最佳信息。