I am trying to post a command + mouse drag event to a specific window.
- Create an NSEvent
- Post the underline cgevent
It does not work whether with postToPid
or post
. What I want to achieve is that: there are maybe multiple window at the same position, I just want to drag the window that I care about to a new position.
let windowNumber = 20 // should be a specific window number
let position = CGPoint(x: 10, y: 10)
let newLoc = CGPoint(x: 20, y:20)
let downNSEvent = NSEvent.mouseEvent(
with: .leftMouseDown,
location: position,
modifierFlags: .command,
timestamp: TimeInterval(),
windowNumber: Int(windowNumber),
context: nil, eventNumber: 0, clickCount: 1, pressure: 1.0
)
let downEvent = downNSEvent?.cgEvent
let flags = CGEventFlags.maskCommand
let eventSource = CGEventSource(event: downEvent)
downEvent?.flags = flags
downEvent?.setIntegerValueField(.mouseEventWindowUnderMousePointer, value: windowNumber)
downEvent?.setIntegerValueField(.mouseEventWindowUnderMousePointerThatCanHandleThisEvent, value: windowNumber)
downEvent?.post(tap: .cghidEventTap)
// downEvent?.postToPid(sourcePid!)
usleep(500_000)
// drag event
var newLoc: CGPoint = CGPoint(x: position.x, y: position.y)
if left {
newLoc.x = destinationBounds.minX - 10
} else {
print("To right")
newLoc.x = destinationBounds.maxX + 10
}
print("Move to position: \(newLoc)")
let dragNSEvent = NSEvent.mouseEvent(
with: .leftMouseDragged,
location: newLoc,
modifierFlags: .command,
timestamp: TimeInterval(),
windowNumber: Int(windowNumber),
context: nil, eventNumber: 1, clickCount: 1, pressure: 1.0
)
let dragEvent = dragNSEvent?.cgEvent
dragEvent?.flags = flags
dragEvent?.setIntegerValueField(.mouseEventWindowUnderMousePointer, value: windowNumber)
dragEvent?.setIntegerValueField(.mouseEventWindowUnderMousePointerThatCanHandleThisEvent, value: windowNumber)
dragEvent?.post(tap: .cghidEventTap)
// dragEvent?.postToPid(sourcePid!)
guard dragEvent != nil else {return}
usleep(500_000)
let upNSEvent = NSEvent.mouseEvent(
with: .leftMouseUp,
location: newLoc,
modifierFlags: .command,
timestamp: TimeInterval(),
windowNumber: Int(windowNumber),
context: nil, eventNumber: 2, clickCount: 1, pressure: 1.0
)
let upEvent = upNSEvent?.cgEvent
upEvent?.flags = flags
upEvent?.setIntegerValueField(.mouseEventWindowUnderMousePointer, value: windowNumber)
upEvent?.setIntegerValueField(.mouseEventWindowUnderMousePointerThatCanHandleThisEvent, value: windowNumber)
upEvent?.post(tap: .cghidEventTap)
// upEvent?.postToPid(sourcePid!)
I have searched the web and so, found no available solutions.