2009-10-01 25 views
0

Obtenir l'application active n'est pas un problème, je l'ai déjà implémenté. Ce que je veux savoir, c'est comment envoyer une combinaison de touches "Cmd-C" à l'application active pour qu'elle place le texte sélectionné dans le presse-papiers (carton général).Comment envoyer une frappe "Cmd-C" à l'application active dans objectif-c, ou dire à l'application de faire une opération de copie?

Ou encore mieux: comment dire à l'application active de faire une opération de copie sans envoyer la frappe, ou sans mettre en surbrillance le menu "Edition" lorsque l'opération de copie est déclenchée.

Je ne peux pas utiliser NSAppleScript (10.2) car cette classe spécifique doit être aussi rétrocompatible que possible (idéalement jusqu'à 10.0).

J'ai regardé NSAppleEvents (ce qui semblerait être le chemin à parcourir) mais je n'arrive pas à trouver un moyen de le faire. Une réponse spécifique serait la bienvenue!

Merci d'avance!

MISE À JOUR:

La solution NSAppleScript par Rob travaille mais je suis toujours intéressé à faire cela sans avoir besoin de NSAppleScript. J'ai essayé d'utiliser CGPostKeyboardEvent (en utilisant la dernière valeur booléenne pour mettre la clé à son statut "up" ou "down") mais je n'arrive pas à trouver les codes de clés ou les tables de codes de caractères. Quelqu'un pourrait-il préciser comment CGPostKeyboardEvent serait utilisé pour taper un «c»? (une table CGCharCode et CGKeyCode serait parfaite).

Répondre

5
+0

Merci pour la réponse rapide, mais la page de référence pour GCPostKeyboardEvent dit que cette méthode est obsolète en 10.6 ... Je travaille sur un produit commercial et j'ai besoin d'une solution à l'épreuve du temps. La discussion dit que CGEventCreateKeyboardEvent serait un bon candidat de remplacement, mais il est seulement supporté depuis 10.4 et plus ... y a-t-il une autre façon de le faire? – Form

+5

@Form Je pense que la façon de gérer cela est la compilation conditionnelle. Utilisez CGPostKeyboardEvent pour <10.3 et CGEventCreateKeyboardEvent pour> = 10.4 – Amok

+1

La prise en charge d'exécution d'Apple pour le SDK 10.6 est la moindre de vos préoccupations. Surtout que vous essayez de cibler pré-10.4, ce qui je suppose serait 10.3.9 puisque c'est le premier SDK universel. – Darren

2

Si vous pouvez activer les événements du système (d'accès pour les appareils et accessoires fonctionnels) sur l'ordinateur, vous pouvez envoyer ce script avec un NSAppleEvent [EDIT: En fait NSAppleScript] initWithSource:

tell application "System Events" to keystroke "c" using command down 

Je n'ai pas vraiment idée quand les événements système ont été introduits, cependant.

+0

Cela semble être une bonne solution bien que je pense que vous vouliez dire NSAppleScript et non NSAppleEvent. J'ai essayé de le faire mais pendant que le script fonctionne dans l'éditeur de script, il ne se trouve pas dans mon application ... J'entends le bip "aucun texte est sélectionné, vous ne pouvez pas copier" quand le script est exécuté dans mon code . Safari a l'accent lorsque cela se produit, donc je ne sais pas du tout quel est le problème ... – Form

+0

Vous avez raison sur NSAppleScript. Désolé pour ça. Le bip signifie que les événements système ne sont pas activés. Il doit être activé dans Préférences Système -> Accès universel -> Activer l'accès pour les appareils fonctionnels. – Rob

+0

Vous pourriez également être intéressé par cela, alors: http://www.macosxhints.com/article.php?story=20060203225241914 – Rob