Getting Mouse Coordinates in Swift

Solution 1:

You should take a look at NSEvent method mouseLocation

edit/update: Xcode 11 • Swift 5.1

If you would like to monitor events on any window when your app is active, you can add a LocalMonitorForEvents matching mouseMoved mask and if it is not active a GlobalMonitorForEvents. Note that you need set to your window property acceptsMouseMovedEvents to true

import Cocoa

class ViewController: NSViewController {
    lazy var window: NSWindow = self.view.window!
    var mouseLocation: NSPoint { NSEvent.mouseLocation }
    var location: NSPoint { window.mouseLocationOutsideOfEventStream }
    override func viewDidLoad() {
        super.viewDidLoad()
        NSEvent.addLocalMonitorForEvents(matching: [.mouseMoved]) {
            print("mouseLocation:", String(format: "%.1f, %.1f", self.mouseLocation.x, self.mouseLocation.y))
            print("windowLocation:", String(format: "%.1f, %.1f", self.location.x, self.location.y))
            return $0
        }
        NSEvent.addGlobalMonitorForEvents(matching: [.mouseMoved]) { _ in
            print(String(format: "%.0f, %.0f", self.mouseLocation.x, self.mouseLocation.y))
        }
    }
    override func viewWillAppear() {
        super.viewWillAppear()
        window.acceptsMouseMovedEvents = true
    }
}

Sample project

Solution 2:

You can get the current mouse location in this way:

  • Declare this in your view controller class:

    var mouseLocation: NSPoint? { self.view.window?.mouseLocationOutsideOfEventStream }
    
  • Then, you can get the current mouse location and convert in your desired view coordinates:

    if let currentMouseLocation = self.mouseLocation{
    
         let pointInTargetView = self.**targetView**.convert(currentMouseLocation, from: self.view)
    
    }