2015-05-04 2 views
1

Я видел много сообщений на эту тему. Но не нашли ясного ответа нигде.Имитировать/включить CAPS LOCK программно в OS X

Есть ли способ переключить CAPS LOCK в Objective-C или C-код? Я не ищу решение с помощью X11 libs. Я не беспокоюсь о статусе включения/выключения светодиодов. Но просто функциональность CAPS LOCK (изменение буквы букв и печать специальных символов на цифровых клавишах).

Почему CGEvent не поддерживает это, как это делается для других ключей?

+0

Объясните, что вы пробовали с API CGEvent, который не работал. –

+0

@KenThomases Я пробовал это: CGEventRef keyDownEvent = CGEventCreateKeyboardEvent (NULL, kVK_CapsLock, true); CGEventPost (kCGHIDEventTap, keyDownEvent); - и соответствующее событие ключа вверх. Ничего не произошло. – Simon

+0

Вы можете попробовать 'CGEventCreate()', затем 'CGEventSetType (..., kCGEventFlagsChanged)' и 'CGEventSetFlags (..., kCGEventFlagMaskAlphaShift). Тогда опубликуйте это. –

ответ

-1

Я получил эту работу после долгой борьбы.

Вызвать метод, приведенный ниже, дважды. Один раз для события и другого для события 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); 
    } 
} 
+0

Извините, но этот код не переключает состояние блокировки. – MacGeek