Посмотрите на комментарии в CGEventSource.h. Немного проще собрать информацию вместе, чем использовать Справочник по службам событий . Длинный, но более правильный, обходной путь выглядит как создание источника события (который подчиняется правилам управления памятью; вам нужно CFRelease
, если вы закончили использовать его до завершения программы): 1006 *
myEventSource = CGEventSourceCreate(kCGEventSourceStatePrivate);
Это создаст ваш собственный источник событий с уникальным идентификатором; Затем вы указываете, что события, которые вы создали, пришли оттуда:
CGEventRef myKeyboardEvent = CGEventCreateKeyboardEvent(myEventSource,
keyCode, true);
Когда приходит событие, проверьте, не от вас ли оно:
if( (CGEventGetType(newEvent) == kCGEventKeyDown) &&
(CGEventGetIntegerValueField(newEvent, kCGEventSourceStateID) == CGEventSourceGetSourceStateID(myEventSource) ) {
Также имеется поле пользовательских данных для источника, которое позволяет вам передавать произвольные 64 бита, если вам нужно.
Быстрый и грязный способ - попытаться выбрать поле события, которое вряд ли будет значимым значением для события клавиатуры, например kCGMouseEventPressure
, и превратить его в сигнатуру:
CGEventSetIntegerValueField(myKeyboardEvent,
kCGMouseEventPressure,
0xFEEDFACE);
// The field is an int_64 so you could make the sig longer