Simulating key press events in Mac OS X
c++, cocoa, keyboard, macos, macos-carbon
Solution
Here's code to simulate a Cmd-S action:
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);
A `CGKeyCode` is nothing more than an unsigned integer:
typedef uint16_t CGKeyCode; //From CGRemoteOperation.h
Your real issue will be turning a character (probably an `NSString`) into a keycode. Fortunately, the Shortcut Recorder project has code that will do just that in the `SRKeyCodeTransformer.m` file. It's great for transforming a string to a keycode and back again.
Problem
I'm writing an app where I need to simulate key press events on a Mac, given a code that represents each key. It seems I need to use the `CGEventCreateKeyboardEvent` function to create the event. The problem is that this function needs a Mac keycode, and what I have is a code that represents the specific key. So, for example, I receive: `KEY_CODE_SHIFT` or `KEY_CODE_A` - these are both numeric constants defined somewhere. I need to take these constants and turn them into `CGKeyCode` values. My current attempt uses code similar to this SO question. The problem is that it only works for printable characters. If all else fails, I'm not above hard coding the conversion, but that would mean that I'd need a table of possible CGKeyCode values, which I have not yet been able to find. Any ideas?