1

This is the code I'm using to simulate a left click, but every time I execute it, the menu associated with a right click comes up. How can I fix this?

func clickLeft() {
    var mouseLoc = NSEvent.mouseLocation()
    mouseLoc.y = NSHeight(NSScreen.screens()![0].frame) - mouseLoc.y
    let point = CGPoint(x: mouseLoc.x, y: mouseLoc.y)
    let mouseDown = CGEvent(mouseEventSource: nil, mouseType: .leftMouseDown, mouseCursorPosition: point, mouseButton: .left)
    let mouseUp = CGEvent(mouseEventSource: nil, mouseType: .leftMouseUp, mouseCursorPosition: point, mouseButton: .left)
    mouseDown?.post(tap: .cghidEventTap)
    usleep(500)
    mouseUp?.post(tap: .cghidEventTap)
}
schnesim
  • 441
  • 1
  • 3
  • 17
  • Stupid me, I had this function linked to a key event which involved holding down the control key. So obviously the context menu had to come up. – schnesim Mar 05 '18 at 07:44

1 Answers1

2

The above answer didn't work at all for me.

However, what I needed was exactly the what @schnesim did - to open the context menu by simulating a click.

To get programmatic mouse clicked I followed the following steps: (XCode 9.4.1. Swift 4.1.2).

1) Disable App Sandbox How to simulate mouse click from Mac App to other Application

2) I modified the question code:

 import Cocoa

class ViewController: NSViewController {

    @IBOutlet var testMenu: NSMenu!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func rightMouseButtonSimulationButtonClicked(_ sender: NSButton) {
        self.simulateMouseClick(.right)
    }

    func simulateMouseClick(_ mouseButtonClicked: CGMouseButton) {

        var mouseLocation = NSEvent.mouseLocation
        var mouseTypeUp: CGEventType!
        var mouseTypeDown: CGEventType!

        switch mouseButtonClicked {
        case .left:
            mouseTypeUp = .leftMouseUp
            mouseTypeDown = .leftMouseDown
        case .right:
            mouseTypeUp = .rightMouseUp
            mouseTypeDown = .rightMouseDown
        case .center:
            mouseTypeUp = .otherMouseUp
            mouseTypeDown = .otherMouseDown
        }

        mouseLocation.y = NSHeight(NSScreen.screens[0].frame) - mouseLocation.y
        let point = CGPoint(x: mouseLocation.x, y: mouseLocation.y)
        let mouseDown = CGEvent(mouseEventSource: nil, mouseType: mouseTypeDown, mouseCursorPosition: point, mouseButton: CGMouseButton(rawValue: mouseButtonClicked.rawValue)!)
        let mouseUp = CGEvent(mouseEventSource: nil, mouseType: mouseTypeUp, mouseCursorPosition: point, mouseButton: CGMouseButton(rawValue: mouseButtonClicked.rawValue)!)

        mouseDown?.post(tap: .cghidEventTap)
        usleep(500)
        mouseUp?.post(tap: .cghidEventTap)
    }

}
Darkwonder
  • 1,149
  • 1
  • 13
  • 26