Какао - NSEvent Ответить на клавишу SHIFT? - PullRequest
3 голосов
/ 09 января 2011

Мне было интересно, реагирует ли NSEvent на клавишу «Shift» на клавиатуре.Я регистрирую keyCodes при отладке моего приложения, и я не получаю значение keyCode для клавиши Shift.

Спасибо,

Кевин

РЕДАКТИРОВАТЬ: Это код, который я использую из ответа пользователя.

-(void)keyDown:(NSEvent*)event
{   

    if ([event modifierFlags] == NSShiftKeyMask) {
        NSLog(@"Shift key pressed");
    }
}

Клавиша Shift все еще небыть признанным ...

Ответы [ 5 ]

15 голосов
/ 10 января 2011

Взгляните на flagsChanged: метод NSResponder.

Примерно так:

- (void) flagsChanged:(NSEvent *) event {
    if ([event modifierFlags] & NSShiftKeyMask) {
        //Do something
    }
}
9 голосов
/ 10 января 2011

Ваш пример кода не работает, потому что -modifierFlags является битовой маской, и поэтому проверка, равна ли маска NSShiftKeyMask, не будет работать.Вам нужно использовать побитовый оператор AND, чтобы проверить, установлен ли флаг:

if ([event modifierFlags] & NSShiftKeyMask) {
    NSLog(@"Shift key pressed");
}

Кроме того, если вы хотите сохранить этот результат в BOOL, вам нужно проверить, что онне равно 0, например:

BOOL shiftKeyPressed = ([event modifierFlags] & NSShiftKeyMask) != 0;

Если вы пропустите это значение, BOOL будет иметь значение NO (если только значение, которое вы извлекаете из битовой маски, не равно 1, которое определяется как YES; для -modifierFlags этого не произойдет, поскольку маски начинаются с 1 << 16).

3 голосов
/ 29 июля 2014

Вот мое решение для обнаружения изменений ключа модификатора:

- (void)keyboard:(AMKeyboardView *)keyboard flagsChanged:(NSEvent *)event {
    if ((event.modifierFlags & NSShiftKeyMask) && !lastShiftState) {
        lastShiftState = true;
        //Shift pressed - do something
    }
    else if (!(event.modifierFlags & NSShiftKeyMask) && lastShiftState) {
        lastShiftState = false;
        //Shift released - do something
    }

    else if ((event.modifierFlags & NSFunctionKeyMask) && !lastFnState) {
        lastFnState = true;
        //Fn pressed - do something
    }
    else if (!(event.modifierFlags & NSFunctionKeyMask) && lastFnState) {
        lastFnState = false;
        //Fn released - do something
    }

    else if ((event.modifierFlags & NSControlKeyMask) && !lastControlState) {
        lastControlState = true;
        //Control pressed - do something
    }
    else if (!(event.modifierFlags & NSControlKeyMask) && lastControlState) {
        lastControlState = false;
        //Control released - do something
    }


    else if ((event.modifierFlags & NSAlternateKeyMask) && !lastOptionState) {
        lastOptionState = true;
        //Option pressed - do something
    }
    else if (!(event.modifierFlags & NSAlternateKeyMask) && lastOptionState) {
        lastOptionState = false;
        //Option released - do something
    }

    else if ((event.modifierFlags & NSCommandKeyMask) && !lastCommandState) {
        lastCommandState = true;
        //Command pressed - do something
    }
    else if (!(event.modifierFlags & NSCommandKeyMask) && lastCommandState) {
        lastCommandState = false;
        //Command released - do something
    }

    else NSLog(@"Other");
}

Для хранения предыдущих состояний требуется 4 переменные экземпляра, но он может обнаруживать нажатие и отпускание каждой клавиши-модификатора.

2 голосов
/ 22 августа 2011

Используйте это для захвата измененных флагов:

- (void)flagsChanged:(NSEvent *)event
{

}
2 голосов
/ 09 января 2011

Клавиша Shift не имеет кода клавиши, поскольку она является модификатором клавиши.Когда вы получаете ключевое событие, присутствие клавиши Shift будет в поле modifierFlags.

...