【问题标题】:NSEvent addGlobalMonitorForEventsMatchingMask: Hotkey InterceptingNSEvent addGlobalMonitorForEventsMatchingMask:热键拦截
【发布时间】:2012-09-04 23:43:29
【问题描述】:

我想拦截以 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 kbd>+2 其他东西,等等……

【问题讨论】:

  • 这是一个位掩码。像其他任何东西一样检查它。
  • 你能用我所问的示例代码回答这个问题,以便我接受你的回答吗?
  • 我不会重新发布该问题的答案。如果我提供的链接回答了您的问题,请单击“标记”链接并写一条消息表明这一点。否则,请更清楚您的要求以及它与我提供的链接有何不同。
  • 我只想知道事件是否由 ctrl-shift 和普通字符触发。例如,看看这个伪代码(基于我上面写的):if((flags == NSControlKeyMask + NSShiftKeyMask) && [event containsCharacter]){ NSLog(@"%@", [event character];} 明白吗?

标签: objective-c xcode macos hotkeys nsevent


【解决方案1】:

你需要按位比较:

- (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]; 
    } 
} 

【讨论】:

  • hai @Pedro Viera,你能告诉我在哪里调用这个 keyDown: 方法吗?
  • @R. Dewi,只需在 applicationDidFinishLaunching: - [NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask handler: ^(NSEvent *event) { NSUInteger flags = [event modifierFlags] & NSDeviceIndependentModifierFlagsMask; if (flags == NSControlKeyMask + NSShiftKeyMask) { //code if user presses ctrl+shift } }]; 上使用它
  • 感谢@PedroVieira 的回答,我可以为 iPad 蓝牙键盘做这样的事情吗?
【解决方案2】:

试试这个:

 [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!");

}];

【讨论】:

  • 这不是您检查位掩码的方式。 modifierFlags 中有额外的标志,可以确保它永远不会是 == 你的 modifier
猜你喜欢
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 2014-05-26
  • 1970-01-01
相关资源
最近更新 更多