Как я могу обнаружить, что нажата клавиша Shift?
У меня есть подкласс NSView
, и я бы хотел, чтобы он реагировал, когда пользователь нажимает клавишу ⇧ Shift. Однако -[NSView keyDown:]
(который я в настоящее время переопределяю) не вызывается, когда нажаты только клавиши-модификаторы.
Как я могу получать уведомления при нажатии клавиши Shift?
Ответы
Ответ 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 и другая клавиша нажата.
Надеюсь, это поможет!
Ответ 6
в документации к яблоку:
Вы должны переопределить метод keydown
со следующими флаги модификатора NSEvent