2010-03-04 7 views
13

Sto scrivendo un'app in cui è necessario simulare eventi di stampa chiave su un Mac, dato un codice che rappresenta ciascuna chiave. Sembra che ho bisogno di utilizzare la funzione CGEventCreateKeyboardEvent per creare l'evento. Il problema è che questa funzione ha bisogno di un codice di accesso Mac e quello che ho è un codice che rappresenta la chiave specifica. Per esempio, ricevo:Simulazione di eventi relativi alla stampa di tasti in Mac OS X

KEY_CODE_SHIFT o KEY_CODE_A - queste sono entrambe le costanti numeriche definite da qualche parte.

Ho bisogno di prendere queste costanti e trasformarle in valori CGKeyCode.

Il mio tentativo corrente utilizza il codice simile a this SO question. Il problema è che funziona solo con caratteri stampabili. Se tutto il resto fallisce, non sono sopra la codifica hard della conversione, ma ciò significherebbe che avrei bisogno di una tabella di valori possibili di CGKeyCode, che non sono ancora stato in grado di trovare.

Qualche idea?

risposta

24

Ecco il codice per simulare una Cmd - S azione:

CGKeyCode inputKeyCode = kVK_ANSI_S; 
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState); 
CGEventRef saveCommandDown = CGEventCreateKeyboardEvent(source, inputKeyCode, YES); 
CGEventSetFlags(saveCommandDown, kCGEventFlagMaskCommand); 
CGEventRef saveCommandUp = CGEventCreateKeyboardEvent(source, inputKeyCode, NO); 

CGEventPost(kCGAnnotatedSessionEventTap, saveCommandDown); 
CGEventPost(kCGAnnotatedSessionEventTap, saveCommandUp); 

CFRelease(saveCommandUp); 
CFRelease(saveCommandDown); 
CFRelease(source); 

Un CGKeyCode non è altro che un intero senza segno:

typedef uint16_t CGKeyCode; //From CGRemoteOperation.h 

Il vostro vero problema sarà svolta un carattere (probabilmente uno NSString) in un codice. Fortunatamente, il progetto Shortcut Recorder ha un codice che farà esattamente quello nel file SRKeyCodeTransformer.m. È ottimo per trasformare una stringa in un codice di accesso e tornare indietro.

+0

Quindi, in questo esempio, il 'CGKeyCode' di' 1' è il codice per S? Inoltre, funzionerebbe solo con un'app in primo piano o se fosse in esecuzione in background, funzionerebbe per tutta la sessione? Grazie – joec

+0

@joec sì a tutti quelli. –

+0

Quindi, dire che la mia app era in esecuzione in background (proprio come un servizio) e avevo Photoshop in primo piano, potevo simulare una pressione di un tasto, e sarebbe stato visto in Photoshop? Grazie – joec

2

Nel caso in cui qualcuno ha bisogno di una versione di Swift:

XCode 7.3 e Swift 2.2:

let event1 = CGEventCreateKeyboardEvent(nil, 0x09, true); // cmd-v down 
CGEventSetFlags(event1, CGEventFlags.MaskCommand); 
CGEventPost(CGEventTapLocation.CGHIDEventTap, event1); 

let event2 = CGEventCreateKeyboardEvent(nil, 0x09, false); // cmd-v up 
CGEventSetFlags(event2, CGEventFlags.MaskCommand); 
CGEventPost(CGEventTapLocation.CGHIDEventTap, event2); 

codice sopra simula CMD-V premuto poi rilasciato (AKA: incolla).