2011-07-01 7 views
10

Ho bisogno di aiuto per scoprire, come dizionario app mostra seguente finestra di pop-up per il testo selezionato premendo CMD + CTRL + D su qualsiasi applicazione. Voglio realizzare lo stesso tipo di funzionalità per la mia app di cacao, dove la mia applicazione verrà eseguito in background e mostrando suggerimenti su alcuni premere il tasto caldo per il testo selezionato.Come ottenere le coordinate globali dello schermo del testo attualmente selezionato tramite le API di accessibilità.

Dictionary app hot key suggestion dialog

ho già implementato cattura tasto di scelta rapida, ho solo bisogno di avere il codice per ottenere l'area rettangolo di testo selezionato sullo schermo, in modo da posso mostrare la finestra di dialogo come applicazione dizionario.

Grazie

+0

come hai mostrato il popover fuori dai limiti della tua app? –

risposta

14

È possibile utilizzare le API di accessibilità per questo. Assicurati che l'impostazione "Abilita accesso per dispositivi ausiliari" sia selezionata (in Preferenze di Sistema/Accesso Universale).

Il seguente frammento di codice determina i limiti (a schermo coordinate) del testo selezionato nella maggior parte delle applicazioni. Sfortunatamente, non funziona in Mail e Safari, perché usano attributi di accessibilità privati. Probabilmente è possibile farlo funzionare anche lì, ma richiede più lavoro e probabilmente chiamate API private.

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); 
+0

Ciao, grazie per il tuo codice. Ho controllato il tuo codice e sembra che funzioni e posso ottenere la selezione vincolata in TextEdit, ma il problema è quando tento di mostrare la finestra di dialogo popup su quel particolare rect, quindi il popup sta mostrando male. Fondamentalmente, la sua posizione x sta funzionando bene, ma non la posizione y. Per favore fatemi sapere, ho bisogno di fare qualche conversione per ottenere le posizioni xey corrette relative allo schermo. – AmitSri

+0

Le coordinate sono capovolte verticalmente. Per ottenere una cornice per il vostro pannello, dovrete convertire la coordinata y in questo modo: 'selectionBounds.origin.y = [[NSScreen mainScreen] telaio] .size.height - selectionBounds.origin.y - selectionBounds.size. height' (semplificato un po ', presuppone che tu abbia solo uno schermo). – omz

+0

Perfetto. Grazie ancora per avermi aiutato. Mi chiedo se posso usare lo stesso codice per ottenere la posizione del punto di inserimento, proprio come il rettangolo di selezione. – AmitSri

0

Quello che stai cercando è un servizio . Con i servizi, l'applicazione non ha nemmeno bisogno di essere in esecuzione o catturare tasti di scelta rapida a livello mondiale.

Ad esempio, la funzionalità dell'applicazione del dizionario che hai descritto è in realtà un servizio, osservabile nel menu Servizi.

Dictionary Service Menu

Apple Service Implementation Guide è probabilmente le migliori informazioni sui servizi là fuori.

+0

Grazie per la risposta. Conosco i servizi e già utilizzato nella mia app per l'acquisizione della selezione del testo. Ma il requisito è mostrare la finestra di pop-up come l'app del dizionario su selezionata/evidenziata sullo schermo, proprio come l'app del dizionario viene mostrata nel mio post. Per favore fatemi sapere ho ottenuto l'area di selezione relativa allo schermo in servizio delegato? Grazie – AmitSri