Ловушка каждой клавиши SHIFT независимо от OS X

У меня есть рабочий код ( здесь), который перехватывает коды клавиш для событий нажатия клавиш, не являющихся модификаторами, и событий, измененных модификаторами.

Но если вы делаете:

LSHIFT down -> RSHIFT down -> RSHIFT up -> LSHIFT up

... внутренние 2 действия не будут вызывать ни одну из этих ловушек, потому что состояние модификатора не меняется!

(РЕДАКТИРОВАТЬ: Woops! Я должен был проверить это перед написанием, потому что на самом деле каждое новое изменение производится с новым модификатором.)

Моя единственная мысль, может быть, дополнительно смотреть на еще более низком уровне ( здесь) - но это не выглядит довольно независимо от того, под каким углом я смотрю на него.

1 ответ

Решение

Взято из ответа Джастина Бу здесь

Я добавил еще один модификатор на тот случай, если кто-то наткнется на это и захочет другие ключи.

- (void) flagsChanged:(NSEvent*)theEvent{
    if ([theEvent modifier] == 131330){
        //do stuff regarding left shift
    }else if ([theEvent modifier] == 131332){
        //do stuff regarding right shift
    }else if ([theEvent modifier] == 65792){
        //caps lock is on
    }else if ([theEvent modifier] == 8388864){
        //FN key pressed
    }else if ([theEvent modifier] == 262401){
        //control key pressed
    }else if ([theEvent modifier] == 524576){
        //option key pressed
    }else if ([theEvent modifier] == 1048840){
        //command key pressed
    }else if ([theEvent modifier] == 256){
        //there are no modified pressed and caps lock is off
    }
}

Я рекомендую хранить некоторые BOOLв вашем классе, такие как LShiftDown а также RShiftDown так как этот метод должен вызываться при нажатии модификаторов. Вы также можете обнаружить это свойство в вашем keyDown реализация для обнаружения различий, таких как "а" и "а".

Другие вопросы по тегам