2010-04-21 31 views
7

J'ai lu environ NSPasteBoard dans la documentation Apple, et comment il permet aux applications d'écrire dans le PasteBoard et permettre à d'autres applications de lire ce texte et de l'utiliser.Comment coller du texte d'une application à une autre en utilisant Cocoa?

Quelqu'un pourrait me dire comment coller le texte d'une application (qui se trouve dans la barre d'état) dans un NSTextField qui est dans une application différente.

Ce que j'essaie de faire est quelque chose de similaire à ce que font Snippet et SnippetsApp.

Si je suis complètement stupide et manqué l'évidence dans Apple Docs, pourriez-vous s'il vous plaît me pointer vers le bon chemin :)

Merci!

Répondre

8

pourrait me dire comment coller du texte de l'application am (qui se trouve dans la barre d'état) dans un NSTextField qui se trouve dans une application différente.

Le collage est ce qui se passe dans l'application réceptrice. L'écriture dans une table de montage est en cours de copie.

En outre, vous ne pouvez pas supposer que l'utilisateur voudra coller dans un NSTextField. Il peut s'agir d'une vue NSTextView ou d'une zone de texte dans un WebView, ou d'un contrôle Carbon EditText ou MLTE, ou d'un autre éditeur de texte tel qu'un éditeur de texte Qt ou wxWidgets. Ils peuvent même utiliser une application avec une vue de liste qui leur permet de coller du texte directement dans celle-ci. Donc, il n'y a pas de façon programmatique de dire directement à une application "voici du texte - collez-le, s'il vous plaît". Vous devez le copier dans la table de montage générale, puis falsifier un événement qui devrait généralement provoquer le collage de l'application la plus à l'avant. La suggestion de Charlie de ⌘V est une façon, quoique difficile; la disposition Dvorak met V sur une autre touche, tandis que la disposition "Dvorak QWERTY ⌘" met V-avec-⌘ (par opposition à V-sans-⌘) sur la même touche que QWERTY V.

For for that ⌘V événement, regardez dans CGEventTap. Vous devrez utiliser the CGEventCreateKeyboardEvent function pour créer l'événement lui-même, et comme cette fonction prend un code de clé, vous devrez rechercher le code de touche approprié pour la partie V de la combinaison ⌘V, ce qui nécessitera de passer par Text Input Source Services ou Keyboard Layout Services, en fonction de la disposition.

Vous pouvez utiliser Accessibility pour trouver l'élément de menu Coller dans le menu Edition et lui envoyer un message AXPress, mais "Coller" et "Modifier" ne sont que des mots anglais pour ces concepts; Si vous l'avez fait, votre application ne fonctionnera dans aucune autre langue. Vous pouvez passer commande (troisième menu, sixième élément de menu), mais votre application ne fonctionnera pas dans les applications sans menu Fichier, ou sans élément de menu Rétablir, ou avec deux éléments de menu Annuler (Photoshop). Forger un événement ⌘V est vraiment la voie à suivre.

+0

CGEventSourceRef ne fonctionne pas pendant que j'ai sandbox ma demande. Y a-t-il un moyen de résoudre le problème? – iPhoneDv

+0

@iPhoneDv: Vous devriez poser une question séparée avec plus d'informations sur ce que vous faites et quel problème vous avez rencontré. –

+0

Voici un lien non-rompu vers la documentation de KeyboardLayoutServices: https://developer.apple.com/legacy/library/documentation/Carbon/Reference/KeyboardLayoutServices/ (Bien sûr, cela n'échouera toujours pas si l'utilisateur a désactivé ou modifié le raccourci clavier pour coller?) – jtbandes

0

En général, la seule façon est d'écrire à la NSPasteboard puis passer à une autre application et utiliser certaines fonctions de carbone pour appuyer sur quelqu'un « Commande-V » ...

6

est ici un code de travail pour afficher le ⌘ + événement clé (en supposant un code d'activation connu):

// 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 moyen de faire fonctionner cela en mode sandbox? –

+1

codeur @cocoa: Je suis assez sûr que non. –

+0

Il existe des applications dans l'appstore qui peuvent coller des données dans une autre application en cliquant sur les éléments d'une table. Vous vous demandez comment ils font cela .. –