Accès à la table de montage donne directement être un no-go. Tout d'abord, launchd won't register the processes1 avec le port mach du serveur. Vous devez d'abord trouver un moyen d'obtenir le port mach du serveur de la table de montage (mach_port_names
?). En outre, la communication directe entre les sessions utilisateur est prohibited2 et les autres communications sont limitées. Je ne suis pas sûr si votre programme aura les droits de se connecter au serveur de carton.
Voici un premier exemple d'utilisation d'événements Apple pour obtenir & en tant que chaîne de caractères. La gestion des erreurs est minime ou inexistante (je ne suis pas certain de ce que je ressens à propos de require_noerr
). Si vous souhaitez obtenir/définir des données de Presse-papiers plusieurs fois au cours d'une exécution, vous pouvez enregistrer les événements Apple et, lors de la copie dans le Presse-papiers, utiliser AECreateDesc
& AEPutParamDesc
ou (peut-être) AEBuildParameters
. AEVTBuilder pourrait être utile.
NSString* paste() {
NSString *content;
AppleEvent paste, reply = { typeNull, 0L };
AEBuildError buildError = { typeNull, 0L };
AEDesc clipDesc = { typeNull, 0L };
OSErr err;
err = AEBuildAppleEvent(kAEJons, kAEGetClipboard,
typeApplicationBundleID, "com.apple.finder", strlen("com.apple.finder"),
kAutoGenerateReturnID, kAnyTransactionID,
&paste, &buildError,
""
);
require_noerr(err, paste_end);
err = AESendMessage(&paste, &reply, kAEWaitReply, kAEDefaultTimeout);
err = AEGetParamDesc(&reply, keyDirectObject, typeUTF8Text, &clipDesc);
require_noerr(err, pastErr_getReply);
Size dataSize = AEGetDescDataSize(&clipDesc);
char* clipData = malloc(dataSize);
if (clipData) {
err = AEGetDescData(&clipDesc, clipData, dataSize);
if (noErr == err) {
content = [NSString stringWithCString:clipData encoding:NSUTF8StringEncoding];
} else {}
free(clipData);
}
AEDisposeDesc(&clipDesc);
pastErr_getReply:
AEDisposeDesc(&reply);
pasteErr_sending:
AEDisposeDesc(&paste);
paste_end:
return content;
}
OSStatus copy(NSString* clip) {
AppleEvent copy, reply = { typeNull, 0L };
AEBuildError buildError = { typeNull, 0L };
OSErr err = AEBuildAppleEvent(kAEJons, kAESetClipboard,
typeApplicationBundleID, "com.apple.finder", strlen("com.apple.finder"),
kAutoGenerateReturnID, kAnyTransactionID,
©, &buildError,
"'----':utf8(@)",
AEPARAMSTR([clip UTF8String])
/*
"'----':obj {form: enum(prop), want: type(@), seld: type(@), from: null()}"
"data:utf8(@)",
AEPARAM(typeUTF8Text),
AEPARAM(pClipboard),
AEPARAMSTR([clip UTF8String])
*/
);
if (aeBuildSyntaxNoErr != buildError.fError) {
return err;
}
AESendMessage(©, &reply, kAENoReply, kAEDefaultTimeout);
AEDisposeDesc(&reply);
AEDisposeDesc(©);
return noErr;
}
Je quitte Core Foundation approche ci-dessus, mais vous voudrez probablement utiliser NSAppleEventDescriptor
pour extraire le contenu du presse-papiers de l'Apple réponse de l'événement.
err = AESendMessage(&paste, &reply, kAEWaitReply, kAEDefaultTimeout);
require_noerr(err, pasteErr_sending);
// nsReply takes ownership of reply
NSAppleEventDescriptor *nsReply = [[NSAppleEventDescriptor alloc] initWithAEDescNoCopy:&reply];
content = [[nsReply descriptorAtIndex:1] stringValue];
[nsReply release];
pasteErr_sending:
AEDisposeDesc(&paste);
paste_end:
return content;
}
Un NSAppleEventDescriptor
est également plus facile d'examiner dans un débogueur qu'un AEDesc
. Pour examiner les réponses, vous pouvez également définir la variable d'environnement AEDebugReceives
lors de l'utilisation d'osascript ou de Script Editor.app:
AEDebugReceives=1 osascript -e 'tell application "Finder" to get the clipboard'
Références:
- "Configuring User Sessions"
- "Communicating Across Login Sessions"
- Mach Kernel Interface, en particulier:
- CFMessagePort Reference (mach enveloppe de port):
- Apple Events Programming Guide
- Apple Event Manager Reference
- AEBuild*, AEPrint* and Friends
- AEBuildAppleEvent sur CocoaDev
- Mac OS X Debugging Magic (pour AEDebugSends et autres AeDebug * variables d'environnement)
N'avez pas encore essayé, mais il semble que la réponse la plus correcte - je préfère que la prime est allé à cette réponse plutôt que la sélection automatique. –
Notez que cette approche doit prendre en charge les types autres que le texte.Vous pouvez utiliser 'AEPrintDescToHandle' après avoir obtenu quelque chose du presse-papiers pour examiner sa structure. 'NSAppleEventDescriptor' peut rendre les résultats d'analyse plus faciles. – outis