2014-01-28 4 views
1

Я искал перехватывание комбинаций клавиш и думал, что IMKit будет хорошим выбором. Расширяясь IMKInputController Я могу перехватить большинство ключей, но, похоже, игнорирует измененные.Intercept Command + key с IMKit (или аналогичным)

Я попытался перекрывая

-(BOOL)inputText:(NSString*)string client:(id)sender; 

и (альтернативно)

-(BOOL)inputText:(NSString*)string 
      key:(NSInteger)keyCode 
     modifiers:(NSUInteger)flags 
      client:(id)sender; 

, но не повезло; только простые методы не вызывается при применении модификаторов. Чтобы быть более конкретным, клавиши command и alt не попадают в методы выше. Простые модификаторы, такие как shift и ctrl Работа (и переменная flags установлена ​​во втором методе). Запустите образец приложения Apple NumberInput, чтобы убедиться сами.

Любые предложения? Неужели я ошибаюсь?

+0

Что происходит, их не называют? «Не повезло» немного расплывчато ... –

+0

updated ............. – Toby

ответ

1

Короткий ответ:

Используйте handleEvent:client: и слушать NSFlagsChanged события.


IMKInputController реализует IMKServerInput Protocol, который предусматривает три варианта для обработки событий.

  1. Ключ связывания - с использованием только inputText:client: и didCommandBySelector:client:
  2. Текстовые данные - с помощью inputText:key:modifiers:client:
  3. обработки всех событий - с помощью handleEvent:client:

Похоже, вы только попробовали два верхних. Вы можете достичь цели с помощью третьего варианта.

Попробуйте следующее:

  1. переопределение recognizedEvents: (от IMKStateSetting Protocol)

    - (NSUInteger)recognizedEvents:(id)sender 
    { 
        return NSKeyDownMask | NSFlagsChangedMask; 
    } 
    
  2. и использовать handleEvent:client:

    -(BOOL)handleEvent:(NSEvent*)event client:(id)sender 
    { 
        NSLog(@"handling event: %@", event); 
        return false; 
    } 
    

Вы можете увидеть распечатку при каждом нажатии клавиши и активации модификаторов в консоли, включая command и alt.

+0

Тестирование этого, установка 'NSKeyUpMask' в' признанныхEvents: 'все еще не ломает события типа NSKeyUp. Думал, что это будет решение этой проблемы, но, по-видимому, нет: http://stackoverflow.com/questions/23620864/imkit-to-catch-nskeyup-event – pkamb