How to post to event to specific window on MacOS?

216 Views Asked by At

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.

0

There are 0 best solutions below