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

Как я могу обнаружить, что нажата клавиша Shift?

У меня есть подкласс NSView, и я бы хотел, чтобы он реагировал, когда пользователь нажимает клавишу ⇧ Shift. Однако -[NSView keyDown:] (который я в настоящее время переопределяю) не вызывается, когда нажаты только клавиши-модификаторы.

Как я могу получать уведомления при нажатии клавиши Shift?

4b9b3361

Ответ 1

В руководстве по обработке событий Cocoa:

Метод flagsChanged: может быть полезен для обнаружения нажатия клавиш модификатора без одновременного нажатия любой другой клавиши. Например, если пользователь нажимает клавишу Option самостоятельно, ваш объект-ответчик может обнаружить это в своей реализации flagsChanged:.

Более подробную информацию можно найти здесь.

В документации для NSResponder также указано следующее:

flagsChanged:

Сообщает получателю, что пользователь нажал или выпустил ключ-модификатор (Shift, Control и т.д.).

- (void) flagsChanged: (NSEvent *) theEvent

Ответ 2

Вот пример, слегка измененный от примера приложения MattKemTest от Matt Gemmell. Создайте базовое приложение Cocoa с помощью одной кнопки и подключите кнопку к IBAction, как это. Затем попробуйте комбинацию клавиш. Документы немного нечеткие, но пример Мэтта очень ясен и представляет все, что вам нужно, чтобы использовать это дальше от документов.

- (IBAction)myAction:(id)sender {
NSUInteger flags = [[NSApp currentEvent] modifierFlags];
if ((flags & NSCommandKeyMask) && (flags & NSAlternateKeyMask) && (flags & NSControlKeyMask)) {
    NSBeginInformationalAlertSheet(@"Modifier keys Command Option Control detected", nil, nil, nil, [NSApp mainWindow], self, nil, nil, nil,
                                   @"You sneaky thing!");
}

if ((flags & NSCommandKeyMask) && (flags & NSShiftKeyMask)) {
    NSBeginInformationalAlertSheet(@"Modifier keys Command Shift detected", nil, nil, nil, [NSApp mainWindow], self, nil, nil, nil,
                                   @"You sneaky thing!");
}

if ((flags & NSAlphaShiftKeyMask)) {
    NSBeginInformationalAlertSheet(@"Modifier keys Caps Lock detected", nil, nil, nil, [NSApp mainWindow], self, nil, nil, nil,
                                   @"You sneaky thing!");
}
if ((flags & NSFunctionKeyMask)) {
    NSBeginInformationalAlertSheet(@"Modifier keys fn detected", nil, nil, nil, [NSApp mainWindow], self, nil, nil, nil,
                                   @"You sneaky thing!");
}

Ответ 3

Здесь приведен код с ключевым событием с проверкой swift 3.0.1 на Xcode 8.2.1 и macOS 10.12.2

override func keyDown(with event: NSEvent) {
    var handled = false
    if event.keyCode == 53 { // ESC, same as `CMD + .`
        handled = true
        print("ESC")
    }
    if event.modifierFlags.contains(.command) { // .shift, .option, .control ...
        if let chars = event.charactersIgnoringModifiers {
            handled = true // likely we are interested with that key
            switch chars {
            case "r":
                print("CMD + r")
            case ",":
                print("CMD + ,")
            case "/":
                print("CMD + /")
            default:
                handled = false
            }
        }
    }
    if !handled {
        super.keyDown(with: event) // let system handle it(may contains sound)
    }
}

Ответ 4

Что вы делаете, если нажатие клавиши не происходит как событие? Например, вы хотите проверить состояние клавиши Shift при запуске программы? Клавиша Shift была нажата до запуска программы и не будет выпущена до тех пор, пока вы не проверите ее состояние.

В Windows вы можете легко получить это с помощью вызова GetKeyState(VK_SHIFT). Что такое эквивалент MacOS?

Ответ 5

Проверка на нажатие:

-(void)keyDown:(NSEvent *)theEvent
{
    if ([theEvent modifierFlags] & NSShiftKeyMask)
    {
        NSLog("Shift key was pressed");
    }
}

Проверка выпуска:

-(void)keyUp:(NSEvent *)theEvent
{
    if(!([theEvent modifierFlags] & NSShiftKeyMask))
    {
        NSLog("Shift key was released");
    }
}

Следует отметить, что функция NSLog будет вызываться только в том случае, если SHIFT и другая клавиша нажата.

Надеюсь, это поможет!