objective macintosh developer apple macos cocoa service accessibility

macos - macintosh - swift ios documentation



Obtener el texto seleccionado actualmente en la aplicaciĆ³n activa en Cocoa (1)

Tengo una aplicación de menú de estado que se puede iniciar utilizando un atajo de todo el sistema. Cuando la aplicación se active, sería genial si pudiera obtener de algún modo el texto que está seleccionado en la aplicación en ejecución.

Entonces, por ejemplo, escribo algo en mi editor de texto, selecciono el texto, presiono mi atajo global, aparece mi aplicación y ahora me encantaría saber el texto seleccionado del editor de texto.

Lo que tengo hasta ahora es el siguiente (código adoptado de Cómo obtener coordenadas de la pantalla global del texto seleccionado actualmente a través de las API de accesibilidad ) .

AXUIElementRef systemWideElement = AXUIElementCreateSystemWide(); AXUIElementRef focussedElement = NULL; AXError error = AXUIElementCopyAttributeValue(systemWideElement, kAXFocusedUIElementAttribute, (CFTypeRef *)&focussedElement); if (error != kAXErrorSuccess) { NSLog(@"Could not get focussed element"); } else { AXValueRef selectedTextValue = NULL; AXError getSelectedTextError = AXUIElementCopyAttributeValue(focussedElement, kAXSelectedTextAttribute, (CFTypeRef *)&selectedTextValue); if (getSelectedTextError == kAXErrorSuccess) { selectedText = (__bridge NSString *)(selectedTextValue); NSLog(@"%@", selectedText); } else { NSLog(@"Could not get selected text"); } } if (focussedElement != NULL) CFRelease(focussedElement); CFRelease(systemWideElement);

El problema aquí es que no funciona con aplicaciones como Safari y Mail ...

Gracias


Esto no es técnicamente una solución a su pregunta exacta porque el usuario tendría que desencadenar esto desde el menú Servicios en lugar de simplemente suceder cuando activan su aplicación de barra de menú.

Podría usar un Servicio del sistema . Usted crea un servicio para su aplicación que envía el texto seleccionado actualmente a la aplicación de la barra de menú a través de una Pasteboard.