Vraag Simulatie van toetsdrukgebeurtenissen in Mac OS X


Ik schrijf een app waarin ik toetsaanslagen op een Mac moet simuleren, op basis van een code die voor elke toets staat. Het lijkt erop dat ik de CGEventCreateKeyboardEvent functie om de gebeurtenis te creëren. Het probleem is dat deze functie een Mac-keycode nodig heeft en wat ik heb is een code die de specifieke sleutel vertegenwoordigt. Dus ik ontvang bijvoorbeeld:

KEY_CODE_SHIFT of KEY_CODE_A - dit zijn beide numerieke constanten die ergens zijn gedefinieerd.

Ik moet deze constanten nemen en ze veranderen CGKeyCode waarden.

Mijn huidige poging gebruikt dezelfde code als deze ZO vraag. Het probleem is dat het alleen werkt voor afdrukbare tekens. Als al het andere faalt, sta ik niet boven het coderen van de conversie, maar dat zou betekenen dat ik een tabel met mogelijke CGKeyCode-waarden nodig heb, die ik nog niet heb kunnen vinden.

Om het even welke ideeën?


13
2018-03-04 14:13


oorsprong


antwoorden:


Hier is de code om a te simuleren cmd-S actie:

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);

EEN CGKeyCode is niets meer dan een geheel getal zonder teken:

typedef uint16_t CGKeyCode;  //From CGRemoteOperation.h

Je echte probleem zal een personage worden (waarschijnlijk een NSString) in een toegangscode. Gelukkig is de Shortcut Recorder project heeft code die precies dat in de SRKeyCodeTransformer.m het dossier. Het is geweldig voor het transformeren van een string naar een keycode en weer terug.


24
2018-03-04 15:07



Voor het geval dat iemand een Swift-versie nodig heeft:

XCode 7.3 en 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);

Code hierboven simuleert CMD-V ingedrukt en vervolgens losgelaten (AKA: plakken).


2
2017-07-27 16:00