2010-04-21 10 views
7

Ho letto circa NSPasteBoard nella documentazione di Apple e come consente alle applicazioni di scrivere nello PasteBoard e consentire ad altre applicazioni di leggere quel testo e utilizzarlo.Come incollare il testo da un'app all'altra usando Cocoa?

Qualcuno potrebbe dirmi come incollare il testo da un'applicazione (che si trova nella barra di stato) in un NSTextField che si trova all'interno di un'applicazione diversa.

Quello che sto cercando di fare è qualcosa di simile cosa Snippet e SnippetsApp fare.

Se io sono completamente stupido e perso l'ovvio a Apple Docs, la prego indicare la strada giusta :)

Grazie!

risposta

8

Qualcuno potrebbe dirmi come incollare il testo dall'applicazione am (che si trova nella barra di stato) in un campo NSText che si trova all'interno di un'applicazione diversa.

Incollare è ciò che accade nell'applicazione di ricezione. La scrittura su un cartone è una copia.

Inoltre, non si può presumere che l'utente vorrà incollare in un NSTextField. Può essere un NSTextView o un'area di testo in una WebView o un controllo Carbon EditText o MLTE o qualche altro editor di testo come un editor di testo Qt o wxWidgets. Potrebbero persino utilizzare un'app con una visualizzazione elenco che consente di incollare il testo direttamente in essa.

Quindi, non esiste un modo programmatico per dire direttamente a un'applicazione "ecco un po 'di testo - incollarlo, per favore". Devi copiarlo nella tavolozza generale e quindi creare un evento che generalmente dovrebbe incollare l'applicazione in primo piano. Il suggerimento di Charlie di ⌘V è un modo, anche se difficile; il layout di Dvorak mette V su un'altra chiave, mentre il layout "Dvorak QWERTY puts" mette V-con-⌘ (a differenza di V-without-⌘) sullo stesso tasto di QWERTY V.

Per forgiare quel ⌘V evento, guarda su CGEventTap. Dovrai utilizzare lo the CGEventCreateKeyboardEvent function per creare l'evento stesso, e poiché tale funzione richiede un codice chiave, dovrai cercare il codice tasto corretto per la parte V della combinazione ⌘V, che richiederà il passaggio da Text Input Source Services o Keyboard Layout Services, a seconda del layout.

Si potrebbe a questo punto pensare di utilizzare Accessibilità per trovare la voce di menu Incolla nel menu Modifica e inviarlo un messaggio AXPress, ma "Incolla" e "Modifica" sono solo le parole inglesi per questi concetti; se l'hai fatto, la tua app non funzionerebbe in nessun'altra lingua. Potresti andare su ordine (terzo menu, sesta voce di menu), ma la tua app non funzionerebbe in applicazioni senza un menu File, o senza una voce di menu Ripeti, o con due voci di menu Annulla (Photoshop). Creare un evento ⌘V è davvero la strada da percorrere.

+0

CGEventSourceRef non funziona, mentre io ho la mia domanda sandbox. C'è un modo per risolvere il problema? – iPhoneDv

+0

@iPhoneDv: dovresti fare una domanda separata con ulteriori informazioni su cosa stai facendo e quale problema hai incontrato. –

+0

Ecco un collegamento non interrotto alla documentazione di KeyboardLayoutServices: https://developer.apple.com/legacy/library/documentation/Carbon/Reference/KeyboardLayoutServices/ (Naturalmente, non funzionerà ancora se l'utente ha disabilitato o modificato la scorciatoia da tastiera per incollare?) – jtbandes

0

In genere l'unico modo è quello di scrivere al NSPasteboard e poi passare a un'altra applicazione e utilizzare alcune funzioni di carbonio a premere il tasto "Command-V" ...

6

Ecco alcuni codice di lavoro di inviare la ⌘ + evento chiave (assumendo un keycode noto):

// some common keycodes 
#define KEY_CODE_x ((CGKeyCode)7) 
#define KEY_CODE_c ((CGKeyCode)8) 
#define KEY_CODE_v ((CGKeyCode)9) 

void DCPostCommandAndKey(CGKeyCode key) 
{ 
    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState); 

    CGEventRef keyDown = CGEventCreateKeyboardEvent(source, key, TRUE); 
    CGEventSetFlags(keyDown, kCGEventFlagMaskCommand); 
    CGEventRef keyUp = CGEventCreateKeyboardEvent(source, key, FALSE); 

    CGEventPost(kCGAnnotatedSessionEventTap, keyDown); 
    CGEventPost(kCGAnnotatedSessionEventTap, keyUp); 

    CFRelease(keyUp); 
    CFRelease(keyDown); 
    CFRelease(source); 
} 
+0

Un modo per farlo funzionare in modalità sandbox? –

+1

codificatore di Coco: sono abbastanza sicuro di no. –

+0

Ci sono app nell'appstore che possono effettivamente incollare i dati su un'altra app facendo clic sugli elementi in una tabella. Mi chiedo come fanno a farlo .. –

Problemi correlati