ОБНОВЛЕНИЕ: код клавиши Shift не 56
, согласно Events.h:
...
kVK_Shift = 0x38,
...
(РЕДАКТИРОВАТЬ: конечно, те из вас, кто обращает внимание (я не был), понимают, что HEX 38 == 56 декабря.)
Я также понял, как получить нажатия клавиш-модификаторов: flagsChanged:
. Таким образом, используя этот код клавиши, я могу отловить нажатия клавиш Shift в flagsChanged:
, и повтор работает отлично; Я также получаю повторяющиеся события клавиш для «обычных» клавиш в keyDown:
и keyUp:
без затруднений.
Звучит так, что у вас может не быть доступа к желаемому изменению кода обработки событий (чтобы добавить flagsChanged:
), или вы хотите изменить его, поэтому, если этот код ключа не работает для вас, я озадачен и могу только сказать " Удачи! "
Я полагаю, что поле, которое вы устанавливаете, используется не для того, чтобы указать, что событие должно быть повторено системой, а для того, чтобы событие было автоматическим повторением Предыдущее событие Вы все еще должны генерировать каждое событие самостоятельно. Что-то вроде (ИЗМЕНЕНО для использования таймера вместо цикла):
CGEventSourceRef eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
CGEventRef eventDown = CGEventCreateKeyboardEvent(eventSource, (CGKeyCode)1, true);
// Post the initial keydown
CGEventPostToPSN(&pidNumber, eventDown);
// Keep track of how many Shift keydown events have been sent
shiftKeyRepeatCount = 1;
[NSTimer scheduledTimerWithTimeInterval:0.3 // I don't know exactly what the interval should be, of course
target:self
selector:@selector(repeatShiftKeyDown:)
userInfo:nil
repeats:YES];
CFRelease(eventDown);
- (void)repeatShiftKeyDown:(NSTimer *)tim {
if( shiftKeyRepeatCount >= kRepeatCountForSpecialTool ){
[tim invalidate];
[self sendShiftKeyUp];
return;
}
shiftKeyRepeatCount++;
GEventSourceRef eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
CGEventRef eventDown = CGEventCreateKeyboardEvent(eventSource, (CGKeyCode)1, true);
// Set the auto-repeat field
CGEventSetIntegerValueField(eventDown, kCGKeyboardEventAutorepeat, 1);
CGEventPostToPSN(&pidNumber, eventDown);
CFRelease(eventDown);
}
Я не уверен, можете ли вы повторно использовать первое событие с измененным полем, или вам нужно будет сгенерировать новое событие для повторения.