🐕

Mac ステータスバーアプリの右クリックと左クリックの分け方

2022/01/29に公開

Macのステータスバーアプリで右クリックと左クリックの挙動を分けたい

AppDelegate.swift
class AppDelegate: NSObject, NSApplicationDelegate {
  func applicationDidFinishedLaunching(_ notification: Notification) {
    // .....
    // .....

    if let button = statusItem?.button {
        button.image = NSImage(named: "iconImage")
        button.action = #selector(self.statusBarButtonClicked(_:))
        button.sendAction(on: [.leftMouseUp, .rightMouseUp])
    }
    // Add Menu Item for NSMenu
    menu.addItem(NSMenuItem(title: "Quit", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q"))
  }
  @objc func statusBarButtonClicked(_ sender: NSStatusBarButton) {
    let event = NSApp.currentEvent!
    if event.type == NSEvent.EventType.rightMouseUp {
      print("Right Click")
      statusItem?.menu = menu
      statusItem?.button?.performClick(nil)
      // statusItem?.popUpMenu(menu)
      statusItem?.menu = nil
    } else {
      print("Left Click")
      togglePopover(sender)
    }
  }
}

NSEvent.EventTypeでマウスの右クリックか左クリックを判別することができます。

コメントで消してありますが、popUpMenu()'popUpMenu' was deprecated in macOS 10.14となっております。

popUpMenu()でも実際にはうまく動きましたが、
statusItem?.button?.performClick(nil)を代わりに使うと良さそうです。

これで、ポップアップと設定メニューを切り分けることができました。

最後まで読んでいただき、ありがとうございます。

参考

https://stackoverflow.com/questions/33257848/left-vs-right-click-status-bar-item-mac-swift-2/68124596#68124596

https://samoylov.eu/2016/09/14/handling-left-and-right-click-at-nsstatusbar-with-swift-3/

Discussion