Как определить разницу между пользовательским событием клавиатуры и сгенерированным?
Я установил клавиатурный крючок:
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