Как определить разницу между пользовательским событием клавиатуры и сгенерированным?

Я установил клавиатурный крючок:

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {

в основном я хочу взять клавиатуру пользователя, съесть ввод и опубликовать свой собственный ввод.

поэтому, если он нажмет "g", я, возможно, захочу опубликовать" foo " в текстовом поле.

Я пишу в текстовое поле с CGEventPost и CGEventSetUnicodeString Как найти здесь: http://www.mail-archive.com/cocoa-dev@lists.apple.com/msg23343.html

проблема в том, что каждый из моих программно введенные символы попадают на крючок клавиатуры. Так что я не могу return NULL в крючке клавиатуры, чтобы заблокировать ввод пользователя... это блокирует все входные данные программы!

Я дифференцировал их на стороне Windows В C# с флагом "injected", см. мой вопрос год назад здесь:как использовать низкоуровневые 8-битные флаги в качестве условных?

ищет что-то похожее в Objective-C.

1 ответов


взгляните на комментарии в CGEventSource.h. Это немного проще собрать информацию вместе, чем использовать Справочник По Службам Событий. Длинный, но более правильный, путь выглядит так:создание источника событий (который подлежит правилам управления памятью; вам нужно CFRelease это, если вы закончили использовать его до завершения программы):

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