Я получил эту работу после долгой борьбы.
Вызвать метод, приведенный ниже, дважды. Один раз для события и другого для события down. Например, для моделирования CAPS A нам нужно сделать следующее.
[self handleKeyEventWithCapsOn:0 andKeyDown:NO];
[self handleKeyEventWithCapsOn:0 andKeyDown:YES];
0 - код ключа для 'a'.
- (void) handleKeyEventWithCapsOn:(int) keyCode andKeyDown:(BOOL)keyDown
{
if(keyDown)
{
CGEventRef eventDown;
eventDown = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)keyCode, true);
CGEventSetFlags(eventDown, kCGEventFlagMaskShift);
CGEventPost(kCGSessionEventTap, eventDown);
CFRelease(eventDown);
}
else
{
CGEventRef eventUp;
eventUp = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)keyCode, false);
CGEventSetFlags(eventUp, kCGEventFlagMaskShift);
CGEventPost(kCGSessionEventTap, eventUp);
// SHIFT Up Event
CGEventRef eShiftUp = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)56, false);
CGEventPost(kCGSessionEventTap, eShiftUp);
CFRelease(eventUp);
CFRelease(eShiftUp);
}
}
Объясните, что вы пробовали с API CGEvent, который не работал. –
@KenThomases Я пробовал это: CGEventRef keyDownEvent = CGEventCreateKeyboardEvent (NULL, kVK_CapsLock, true); CGEventPost (kCGHIDEventTap, keyDownEvent); - и соответствующее событие ключа вверх. Ничего не произошло. – Simon
Вы можете попробовать 'CGEventCreate()', затем 'CGEventSetType (..., kCGEventFlagsChanged)' и 'CGEventSetFlags (..., kCGEventFlagMaskAlphaShift). Тогда опубликуйте это. –