如何在Cocoa应用程序中关闭键盘声音?

4

我有一个关于我的OpenGL Cocoa应用程序的问题 - 每当触发keyUp / KeyDown事件时,都会播放系统声音...我该如何为我的应用程序禁用此逻辑?

我有一种不好的感觉,认为由于某些奇怪的原因,我的应用程序可能会将按键操作视为错误并播放系统警告声音...请帮忙解决!


你看过 NSSound 类的参考文献吗?'- (void)setVolume:(float)volume' - Parag Bafna
很有趣,但是这不是一个静态方法,而且我不能用它禁用所有声音...我的应用程序没有以任何方式使用Cocoa音频服务... - Ryan
4个回答

5

将以下代码添加到您的NSView/NSWindow子类中

- (void)keyDown:(NSEvent *)theEvent {

对于上下箭头键进行特殊处理,但对于其他键则执行 [super keyDown: theEvent]。

我认为这可能有意义。


这对我有效。当你不想它发出哔声时,在keyDown中返回nil。 - Paul Slocum
当您说将其添加到NSView时,您指的是子类化了NSView的文件,对吗? - mginn

4

对于我来说,以下内容已经被证明是最佳解决方案:

override func awakeFromNib() { 

    // Do your setup here.    

    NSEvent.addLocalMonitorForEvents(matching: .keyDown) {
       if keyDownPressed(with: $0) {
          return nil
       }
       return $0
    }
}

func keyDownPressed(with event: NSEvent) -> Bool {

    print("caught a key down: \(event.keyCode)")

    if event.keyCode == 125 {
        //your code for arrow down here
        return true
    }

    if event.keyCode == 126 {
        //your code for arrow up here
        return true
    }

    return false
}

0
  1. 创建一个Cocoa类,将其从NSView子类化
  2. 将其设置为您的视图的类,而不是Storyboard中标准的灰色NSView
  3. 在您的子类实现中添加以下内容:
@implementation YourCustomNSView
- (BOOL)acceptsFirstResponder { return YES; }
- (void)keyDown:(NSEvent *)theEvent {
NSLog (@"keypress %@", theEvent); // [super keyDown:theEvent]; // 这一行会触发系统蜂鸣错误,没有它就没有蜂鸣声 }
@end

0

Swift 5.6 解决方案

这是由于响应链中未处理的 keydown 事件引起的。

确保你的响应链中有一些 NSView 子类覆盖了此方法并返回 true。

override performKeyEquivalent(with event: NSEvent) -> Bool {}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接