Search code examples
objective-ccocoamacoscore-graphicsmacos-carbon

Send auto-repeated key using CoreGraphics methods (Mac OS X Snow Leopard)


I have been successful sending keystrokes in order to automate a particular software package for drawing that I use. This software relies a lot of keyboard shortcuts so I wrote something that could call some of these keyboard shortcuts in order to streamline my workflow. As I said, this has worked out good.

My library is a Cocoa library that is loaded as a plugin to the software package. Here is a snippet of code that I have been using for sending my keystrokes.

CGEventSourceRef eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
CGEventRef eventDown = CGEventCreateKeyboardEvent(eventSource, (CGKeyCode)1, true);
CGEventRef eventUp = CGEventCreateKeyboardEvent(eventSource, (CGKeyCode)1, false);

//setting the process number somewhere else
CGEventPostToPSN(&number, eventDown);
CGEventPostToPSN(&number, eventUp);

For some procedures in the drawing package if you continue to hold the Shift key then you activate a special tool. I have been unable to simulate this. I thought I could send the Shift key and say that I wanted it to auto-repeat but that doesn't seem to work. I have been using the following code to set the auto-repeat:

//This is done before sending the key
CGEventSetIntegerValueField(eventDown, kCGKeyboardEventAutorepeat, 1);

In my testing I have been unable to make any key auto-repeat. It just send the key once and that is it.

Is there anyone that have been successful autorepeating a key using the above method? I have searched the Internet for answers but all I have found are some unanswered questions from 2008... Any help is greatly appreciated.

Thanks,

mobbe


Solution

  • The code that OP finally came up with to solve the problem (transferred here from a comment under other answer):

    CGEventRef flagsChanged = CGEventCreate(eventSource); 
    CGEventSetType(flagsChanged, kCGEventFlagsChanged); 
    CGEventSetIntegerValueField(flagsChanged, kCGKeyboardEventKeycode, 56);     
    CGEventSetFlags(flagsChanged, 131330); 
    CGEventPostToPSN(&number, flagsChanged); 
    CFRelease(flagsChanged); CFRelease(eventSource);
    

    131330 is a constant indicating the Shift key; it is related to NSShiftKeyMask and kCGEventFlagMaskShift, which are 131072 (0x00020000). 131330 - 256 - 2 == 131072.