Подтвердить что ты не робот

NSRsponder не принимает событие keyUp, когда клавиша Cmd ⌘ нажата

Я использую собственный подкласс NSView и получаю события клавиатуры через методы keyDown/keyUp, все работает отлично, за исключением случаев, когда нажата клавиша Cmd pressed, события keyDown запускаются как обычно, но событие keyUp никогда не появляется.

В нашем случае мы используем клавиши со стрелками самостоятельно, чтобы перемещать изображение влево/вправо/вверх/вниз, и если пользователь удерживает "Cmd ⌘", одновременно нажимая влево/вправо, он будет поворачивать изображение вместо этого. Поскольку мы получаем событие keyDown, изображение начинает вращаться, но оно никогда не останавливается, поскольку keyUp никогда не появляется. Другие модификаторы не имеют этой проблемы (например, если сдвиг, ctrl или alt удерживаются при нажатии другой клавиши, мы получаем keyUp, как ожидалось). Один из вариантов - использовать другой модификатор, но было бы неплохо сохранить его в соответствии с версией ПК (Cmd используется в качестве замены, когда Ctrl используется в Windows, поддерживает его в соответствии со стандартными командами копирования/вставки и т.д.).

Кто-нибудь знает, почему он это делает? Это похоже на ошибку, но, вероятно, просто странное "правильное поведение", любые идеи о том, как обойти его (кроме использования альтернативного модификатора или использования подобных прямых HID-доступа).

Спасибо.

4b9b3361

Ответ 1

Вы можете использовать flagsChanged чтобы получать уведомления, когда клавиши-модификаторы выключены/см., См.: Технические вопросы и ответы QA1519 Обнаружение клавиши Caps Lock, которая применима к другим клавишам-модификаторам.

- (void)flagsChanged:(NSEvent *)event
{
    if (event.keyCode == 0x37) { // kVK_Command
        if (event.modifierFlags & NSCommandKeyMask) {
            NSLog(@"Command key is down");            
        } else {
            NSLog(@"Command key is up");
        }
    }
}