NSEvent addGlobalMonitorForEventsMatchingMask: перехват горячих клавиш

Я хочу перехватывать горячие клавиши, которые начинаются с Control+Shift и заканчиваются символом (обязательно).
У меня есть следующий код:

[NSEvent addGlobalMonitorForEventsMatchingMask:NSFlagsChangedMask handler: ^(NSEvent *event) {
    NSUInteger flags = [event modifierFlags] & NSDeviceIndependentModifierFlagsMask;
    if(flags == NSControlKeyMask + NSShiftKeyMask){
        NSLog(@"pressed!");
    }
}];

Что мне нужно добавить в свой код, чтобы проверить, нажал ли пользователь ControlShift+символ, и какой символ нажал пользователь?
Код NSLog(@"pressed!"); будет выполнен только в том случае, если то, что я сказал выше, верно.

Это мой псевдокод для того, что я ищу:

[NSEvent addGlobalMonitorForEventsMatchingMask:NSFlagsChangedMask handler: ^(NSEvent *event) {
    NSUInteger flags = [event modifierFlags] & NSDeviceIndependentModifierFlagsMask;
    if((flags == NSControlKeyMask + NSShiftKeyMask) && [event containsCharacter]){
       NSLog(@"%@", [event character];
    }
}];

Итак, если пользователь нажмет Control+Shift+1, я сделаю одно, если Control+Shift+ 2 другое дело и так далее...


person Pedro Vieira    schedule 12.09.2012    source источник
comment
comment
Это битовая маска. Проверьте его, как и любой другой.   -  person jscs    schedule 12.09.2012
comment
не могли бы вы ответить на вопрос с примером кода того, что я спросил, чтобы я мог принять ваш ответ, пожалуйста?   -  person Pedro Vieira    schedule 12.09.2012
comment
Я не собираюсь повторно публиковать ответ на этот вопрос. Если ссылка, которую я предоставил, ответила на ваш вопрос, то нажмите на ссылку с флажком и напишите сообщение, указывающее на это. В противном случае поясните, о чем вы спрашиваете, и чем это отличается от предоставленной мной ссылки.   -  person jscs    schedule 12.09.2012
comment
я просто хочу знать, было ли событие вызвано ctrl-shift и обычным символом. например, взгляните на этот псевдокод (на основе того, что я написал выше): if((flags == NSControlKeyMask + NSShiftKeyMask) && [event containsCharacter]){ NSLog(@"%@", [event character];} понятно?   -  person Pedro Vieira    schedule 12.09.2012
comment
Чтобы фиксировать глобальные нажатия клавиш, вам также необходимо включить доступ для вспомогательных устройств в меню специальных возможностей системных настроек.   -  person Eric    schedule 24.09.2013


Ответы (2)


Вам нужно сравнить побитовое:

- (void)keyDown:(NSEvent *)theEvent { 
    if ([theEvent modifierFlags] & (NSControlKeyMask | NSShiftKeyMask)) { 
        if (theEvent.keyCode == 1/* add the right key code */) {
            NSLog(@"Do something");
        }
    } else { 
        [super keyDown:theEvent]; 
    } 
} 
person IluTov    schedule 14.09.2012
comment
hai @Pedro Viera, не могли бы вы сказать мне, где вызвать этот метод keyDown:? - person R. Dewi; 20.09.2012
comment
@Р. Деви, просто используй это на applicationDidFinishLaunching: - [NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask handler: ^(NSEvent *event) { NSUInteger flags = [event modifierFlags] & NSDeviceIndependentModifierFlagsMask; if (flags == NSControlKeyMask + NSShiftKeyMask) { //code if user presses ctrl+shift } }]; - person Pedro Vieira; 20.09.2012
comment
спасибо за ответ @PedroVieira, могу ли я сделать что-то подобное для Bluetooth-клавиатуры iPad? - person R. Dewi; 20.09.2012

Попробуй это:

 [NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(NSEvent *event) {
    NSUInteger key = 8; // 8 is "C"
    NSUInteger modifier = NSControlKeyMask + NSShiftKeyMask; 
    if ([event keyCode] == key && [NSEvent modifierFlags] == modifier)

NSLog(@"pressed!");

}];
person Ramaraj T    schedule 12.09.2012
comment
Это не то, как вы проверяете битмаски. В modifierFlags есть дополнительные флаги, которые гарантируют, что он никогда не будет == вашим modifier. - person jscs; 12.09.2012