cocoa - 在 Cocoa (OS X) 中按住多个键

标签 cocoa keyboard

我是 Mac 编程新手,所以我希望这不是很明显。

简而言之,我似乎没有收到多个按键事件。我创建了这个片段,它从不触发断言,因此从不打印多个键。不过,我得到了单键打印。

- (void)keyDown:(NSEvent *) theEvent {
    NSString *characters = [theEvent characters];
    assert([characters length]<2);
    for (int i=0;i<[characters length];++i) {
      NSLog(@"k=[%d]\n", [characters characterAtIndex:i]);
    }
  }

有人知道我做错了什么吗?如果您有兴趣,我需要多次按键才能实现 OpenGL 查看应用程序。也许我完全不适合这种应用程序。

编辑:经过进一步研究,我发现了这一点: http://www.cocoadev.com/index.pl?GameKeyBoardHandling 根据此处的讨论,这是有道理的,因为只有最后一个键重复。当引发 keyDown 事件时,向下键将被放置在 set 中并在 keyUp 上被删除。这意味着该组具有完整的当前按下的键集,避免了仅重复最后按下的问题。 它“足够好”,所以我现在正在使用这个方法。它似乎工作得很好,并且因为它使用标准键盘事件系统(而不是 HID),所以不应该有任何兼容性问题。

问候, 谢恩

最佳答案

有一件事是,您正在测试事件中的字符数,该数量几乎总是 1。在事件中获取超过 1 个字符的最常见方法是使用非西方字符的 IME 输入法。

目前尚不清楚您想要实现什么目标。如果您尝试对用户按下并按住某个键使用react,您将收到多个 keyDown: 事件。在第一个事件上调用 isARepeat 将返回 NO,在后续事件上调用 isARepeat 将返回 YES。

如果您尝试同时检测多个按键,那么您需要自己跟踪 keyDown: 和 keyUp: 之间的按键状态。因此,如果您同时按下 f 和 g,您将得到一个或多个 keyDown: with f 和一个或多个 keyDown: with g。然后,如果您在按住 g 的同时释放 f,您将获得 keyUp: for f,同时继续接收 keyDown: for g。您可以为您获得的每个键设置一个标志,然后在键按下时清除该标志。

如果这些都不是您想要做的,那么您可能需要进一步解释您正在做什么。

关于cocoa - 在 Cocoa (OS X) 中按住多个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1151516/

相关文章:

macos - 访问系统的亚麻图案?

macos - 如何找到具有相同捆绑标识符的多个应用程序?

cocoa - 如何在 cocoa 中使用拉伸(stretch)来调整 NSImage 的大小

objective-c - 在 Objective C 中使用已弃用的方法是否错误

java - 在 EditText 中检测键盘的关闭(通过后退按钮)

javascript - 在不更改 View 的情况下单击键盘上页脚的输入级别! Cordova jQuery

cocoa - Sparkle 自动更新的代码签名问题

c# - 我如何查看是否有任何程序正在模拟 key

keyboard - 选择哪个键用于输入特殊 APL 字符

iOS:如何检测外部键盘上修饰键状态的变化?