Какао - NSEvent Ответить на клавишу SHIFT?
Мне было интересно, реагирует ли NSEvent на клавишу "Shift" на клавиатуре. Я регистрирую keyCodes при отладке моего приложения, и я не получаю значение keyCode для клавиши Shift.
Спасибо,
Kevin
РЕДАКТИРОВАТЬ: это код, который я использую из ответа пользователя.
-(void)keyDown:(NSEvent*)event
{
if ([event modifierFlags] == NSShiftKeyMask) {
NSLog(@"Shift key pressed");
}
}
Клавиша Shift все еще не распознается...
5 ответов
Посмотрите на flagsChanged:
метод NSResponder
,
Что-то вроде этого:
- (void) flagsChanged:(NSEvent *) event {
if ([event modifierFlags] & NSShiftKeyMask) {
//Do something
}
}
Ваш пример кода не работает, потому что -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
).
Используйте это, чтобы захватить измененные флаги:
- (void)flagsChanged:(NSEvent *)event
{
}
Вот мое решение для обнаружения изменений ключа модификатора:
- (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 переменных экземпляра для хранения предыдущих состояний, но он может обнаруживать нажатие и отпускание каждой клавиши-модификатора.
Клавиша Shift не имеет кода клавиши, поскольку она является модификатором клавиши. Когда вы получаете ключевое событие, присутствие клавиши Shift будет в modifierFlags
поле.