Objective c 在没有菜单栏的应用程序中关闭Cocoa中最前面的窗口

Objective c 在没有菜单栏的应用程序中关闭Cocoa中最前面的窗口,objective-c,cocoa,keyboard-shortcuts,statusbar,menubar,Objective C,Cocoa,Keyboard Shortcuts,Statusbar,Menubar,我正在Cocoa中构建一个StatusBar应用程序,因此我没有菜单。没有菜单意味着没有“文件>关闭”菜单项,该菜单项通常侦听快捷方式“Command+W” 从我的StatusBar应用程序中,用户可能会打开一个窗口来更改首选项,这就是我遇到的问题:用户只能用鼠标按下红点来关闭窗口。然而,像所有的应用程序一样,我也希望支持“Command+W”快捷方式 目前,我认为有两种可能解决这个问题: 在侦听快捷方式的窗口上放置一个不可见的按钮 为快捷方式添加应用程序范围的侦听器,并手动与窗口联系 这两种解

我正在Cocoa中构建一个StatusBar应用程序,因此我没有菜单。没有菜单意味着没有“文件>关闭”菜单项,该菜单项通常侦听快捷方式“Command+W”

从我的StatusBar应用程序中,用户可能会打开一个窗口来更改首选项,这就是我遇到的问题:用户只能用鼠标按下红点来关闭窗口。然而,像所有的应用程序一样,我也希望支持“Command+W”快捷方式

目前,我认为有两种可能解决这个问题:

  • 在侦听快捷方式的窗口上放置一个不可见的按钮
  • 为快捷方式添加应用程序范围的侦听器,并手动与窗口联系
  • 这两种解决方案都感觉像是对系统的滥用。第一种解决方案可能会导致意外行为(如果用户偶然点击不可见按钮,窗口将关闭),而第二种解决方案仍然会导致嘟嘟声,因为窗口不知道它处理这样的快捷方式

    有没有优雅的方法来解决这个问题?由于视图应该知道该做什么,因此只使用界面生成器的解决方案将是完美的。如果没有优雅的方法,有没有一种方法可以提高所提到的解决方案


    提前谢谢

    如果在主菜单笔尖中放置文件>关闭菜单项,即使菜单不可见,快捷方式也会工作


    如果您选择为快捷方式实现应用程序范围的侦听器,您可以通过从块中返回nil来消除蜂鸣音,这样原始事件就不会被传递。

    非常感谢!很高兴知道菜单栏是不可见的,但“可用”。我还了解到,您无法重新创建菜单栏,因此我希望从其他应用程序复制它。(我删除了它,因为从我的角度来看它是无用的杂乱。)--顺便说一句:消除蜂鸣音不起作用,因为块有签名(NSEvent*(^)(NSEvent*),它不允许我返回nil或NULL。如果你能找到正确的解决方案,我会感兴趣的。学习新东西总是好的。:)再次感谢@Florian:允许从该事件处理程序返回
    nil
    ;这将停止进一步调度事件。Josh:你是对的,NSEvent方法的文档中说可以返回nil。但是,以下代码未在我的计算机上编译:
    [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask处理程序:^(NSEvent*theEvent){return nil;}]。编译错误是
    错误:不兼容的块指针类型初始化“void*(^)(struct NSEvent*)”,应为“struct NSEvent*(^)(struct NSEvent*)”
    。有什么想法吗?@Florian:你宣布该区块具有
    void
    返回类型;它需要有一个
    NSEvent*
    返回<代码>处理程序:^NSEvent*(NSEvent*theEvent){return nil;}]