左对右点击状态栏项目Mac Swift 2

时间:2015-10-21 11:12:35

标签: macos menu swift2 nsstatusitem

我一直在尝试开发一个位于Mac状态栏中的简单程序。我需要它,这样如果你左键单击它会运行一个函数,但如果你右键单击它会显示一个带有About和Quit项目的菜单。

我一直在寻找,但我能找到的只是命令或控制点击建议,但我宁愿不走这条路。

提前致谢,感谢任何帮助!

2 个答案:

答案 0 :(得分:20)

Swift 3

let statusItem = NSStatusBar.system().statusItem(withLength: NSVariableStatusItemLength)

if let button = statusItem.button {
    button.action = #selector(self.statusBarButtonClicked(sender:))
    button.sendAction(on: [.leftMouseUp, .rightMouseUp])
}

func statusBarButtonClicked(sender: NSStatusBarButton) {
    let event = NSApp.currentEvent!

    if event.type == NSEventType.rightMouseUp {
        print("Right click")
    } else {
        print("Left click")
    }
}

Swift 4

let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)

if let button = statusItem.button {
    button.action = #selector(self.statusBarButtonClicked(_:))
    button.sendAction(on: [.leftMouseUp, .rightMouseUp])
}

func statusBarButtonClicked(sender: NSStatusBarButton) {
    let event = NSApp.currentEvent!

    if event.type == NSEvent.EventType.rightMouseUp {
        print("Right click")
    } else {
        print("Left click")
    }
}

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

提供较长的帖子

答案 1 :(得分:0)

在 Swift 5 中,

我就是这样工作的。 通过参考上述答案,我能够检测到是右键单击还是左键单击。

然而,一旦你右击,你就只能一直显示NSMenu。

然后,我添加 statusItem.button?.performClick(nil) & statusItem?.menu = nil

您可以添加 statusItem?.popUpMenu(menu),但它在 macOS 10.14 中已折旧。 (但效果很好。)

最后,如果左键单击,它会运行一个函数。如果右键单击,它会运行退出等菜单项。

感谢之前回答的人!

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)
    }
  }
}