我需要帮助才能找到,在任何应用程序上按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);
您正在寻找的是服务。使用服务,您的应用程序甚至不必运行或捕获全局热键。
例如,您描述的字典应用程序的功能实际上是一项服务,可以在服务菜单中观察到。
“>
Apple的Service Implementation Guide可能是有关服务的最佳信息。
您在这里寻求Swift中的@omz答案