如何处理 Cocoa 菜单栏应用程序中的修改键

How to handle modifier keys in Cocoa menubar application

所以我有一个菜单栏应用程序,在自定义视图中有一个滑块:我希望能够在拖动时按下选项键以使滑块对齐增量。

现在,一切正常... 除了我找不到单一的方法来通知我的菜单应用程序正在按下选项键。这是我尝试过的:

  1. NSEvent.addGlobalMonitorForEvents

    • "Note that your handler will not be called for events that are sent to your own application."
  2. NSEvent.addLocalMonitorForEvents

    • "Your handler will not be called for events that are consumed by nested event-tracking loops such as control tracking, menu tracking, or window dragging"
  3. NSApplication.shared.currentEvent

    • 这不起作用,因为应用程序不处理 flagsChanged 事件,因此该值设置为另一个值(按下鼠标按钮)。
  4. flagsChanged(with event: NSEvent)

    • 这不会被调用。我已将 viewController 设置为 acceptFirstResponder 并辞去了视图的第一响应者。另外,我已经对视图进行了子类化并覆盖了 flagsChanged,但这并没有奏效。
  5. 我试过创建一个菜单项,它有一个像 "s" 或 "p" 这样的键来触发一个动作。但是当 "action" 被触发时,菜单栏隐藏...

所以我正在尝试寻找在按下选项键时如何通知我。这可能吗?如果您有任何问题,我可以澄清。

在自定义滑块视图的 mouseDragged 方法中,您只需检查 NSEvent 参数的 modifierFlags 以查看它是否包含选项键。

--

由于可以将滑块解释为实际的 NSSlider,如果是这种情况,则滑块的控件实际上是在 NSSliderCell 中实现的,并且鼠标跟踪从视图传递到 mouseDown 中的单元格,所以 NSSlider 的 mouseDragged 不会被调用,相反你必须在单元格的 trackMouse:inRect:... 方法中工作。但是如果你使用的是 NSSlider,那么你可能只想使用 altIncrementValue.