【问题标题】:Detect if menu bar is hidden or visible检测菜单栏是隐藏还是可见
【发布时间】:2016-01-26 07:05:52
【问题描述】:

当菜单栏变为隐藏或可见时,Cocoa 有没有办法接收通知(或类似的东西)?我试着环顾四周,并没有找到关于这个主题的任何信息。

谢谢

【问题讨论】:

    标签: objective-c cocoa menubar


    【解决方案1】:

    我通过使用 Carbon 的菜单事件处理程序解决了这个问题。

    我在kEventClassMenu 类下注册了事件kEventMenuBarHidden 和kEventMenuBarShown。

    【讨论】:

    • 您是如何报名参加活动的?
    【解决方案2】:

    (可选)注意 NSStatusBarWindow 类对象的 (Cocoa) 通知和类似通知

    在菜单栏显示或隐藏时得到通知。

    【讨论】:

    • 感谢您的回复。您能否详细说明如何为NSStatusBarWindow 实施通知;我找不到那个类。
    • 所以 NSStatusBarWindow 是 Apple 私有框架的一部分,有没有办法做到这一点,以便应用可以发布到应用商店?
    • 当然不能保证,但我们在应用程序中所做的只是检查字符串 NSStatusBarWindow 以识别类……比较字符串没有害处:-)
    • 我喜欢你的想法:D。但是您如何在所有窗口上观察这些通知以检查NSStatusBarWindow ?我只能在我的应用程序窗口上收到通知。 (感谢您的所有帮助)
    【解决方案3】:

    如果只需要菜单栏的当前状态,另一种方法是使用visibleFrame property of NSScreen:

    返回的矩形始终基于当前的用户界面设置,不包括当前停靠栏和菜单栏占用的区域。

    但是,如果您需要在菜单栏可见性更改时收到通知,这本身是不够的。

    【讨论】:

      【解决方案4】:

      我认为正确的方法是使用键值观察 (KVO) 来观察应用程序对象的 presentationOptions 或 currentSystemPresentationOptions 属性(NSApp 或 [NSApplication sharedApplication])。当它发生变化时,检查它的值是否包含NSApplicationPresentationHideMenuBar 或NSApplicationPresentationAutoHideMenuBar。如果是,则隐藏菜单(或在光标不在主屏幕顶部附近时隐藏。

      presentationOptions 和 currentSystemPresentationOptions 之间的区别在于您是否对调用应用程序是否隐藏了其菜单栏或活动应用程序(可能是另一个应用程序)是否隐藏其菜单栏感兴趣。后者表示用户是否可以看到任何菜单栏。

      【讨论】:

      • 这似乎不起作用,AutoHideMenuBar 选项的存在似乎仅对应于是否选中了 macOS 设置中的自动隐藏按钮,我似乎无法找到一种情况无论菜单栏是否在屏幕上,都存在 HideMenuBar 选项。
      猜你喜欢
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多