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