我需要帮助找出,如何在任何应用程序上按下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);