swift macos mouseevent low-level

swift - Cómo simular el clic del mouse desde la aplicación Mac a otra aplicación



macos mouseevent (4)

Estoy intentando simular el clic del mouse en el simulador de iphone desde la aplicación macos para eso estoy usando CGEvents.

el id del proceso es 33554 para simulador de iPhone

let point = CGPoint(x: 500 , y:300) let eventMouseDown = CGEvent(mouseEventSource: nil, mouseType: .leftMouseDown, mouseCursorPosition: point, mouseButton: .left) let eventMouseUp = CGEvent(mouseEventSource: nil, mouseType: .leftMouseUp, mouseCursorPosition: point, mouseButton: .left) eventMouseDown?.postToPid(33554) eventMouseUp?.postToPid(33554)

También he notado que simula el clic del mouse cuando la ventana del simulador de ios está enfocada y solo funciona para esta barra de herramientas, pero no para el simulador, por ejemplo, si cambio CGPoint a (0,30), hará clic en la opción Simulador

pero cuando estoy dando CGPoints para hacer clic en la aplicación dentro del simulador de iOS no funciona

Sin embargo, puedo publicar eventos de teclado en el simulador usando

let keyboardDown = CGEvent(keyboardEventSource: nil, virtualKey: 6, keyDown: true) let keyboardUp = CGEvent(keyboardEventSource: nil, virtualKey: 6, keyDown: false) keyboardDown?.postToPid(33554) keyboardUp?.postToPid(33554)


Dice que puede publicar eventos de teclado, por lo que probablemente no sea un problema de permiso, pero puede intentar ejecutar su programa como root para descartarlo.

Las coordenadas del evento pueden ser diferentes de lo que esperas (¿volteado?). Intente configurar algo en una aplicación simulada para informar sobre todos los eventos recibidos en el nivel de la aplicación.

Además, ¿están las coordenadas en el sistema de coordenadas de la pantalla? Tal vez el simulador recibe el evento y lo descarta porque no hay una ventana "debajo" para entregarlo. Intente mover la ventana del simulador a cada esquina de la pantalla y use algo como (10,10) para una coordenada.

También puede probar NSEvent y su método CGEvent para obtener el evento subyacente que puede inicializarse correctamente para sus necesidades. Si eso funciona, será más fácil resolver lo que te estás perdiendo.

Por último, intente no pasar nil para el mouseEventSource . Algo como CGEventSourceRef eventSource = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); ¿tal vez?

Último intento de zanja en ayuda:

Tengo una aplicación mac (antigua) que distribuye eventos de mouse fabricados a otros programas; Quizás su código fuente pueda revelar algo útil.

Ahora ... si nada de eso funciona, puede ser beneficioso para usted decirnos qué es exactamente lo que está tratando de lograr. Es posible que haya una manera mucho mejor.


En primer lugar, si nos fijamos en postToPid no hay documentación en absoluto.

Así que ni siquiera estoy seguro de si se supone que funciona y si es así, entonces cuándo y cuándo no. Pero puedes publicar el evento directamente en la pantalla usando el siguiente código

// // main.swift // mouseplay // // Created by Tarun Lalwani on 22/05/18. // Copyright © 2018 Tarun Lalwani. All rights reserved. // import Foundation let source = CGEventSource.init(stateID: .hidSystemState) let position = CGPoint(x: 75, y: 100) let eventDown = CGEvent(mouseEventSource: source, mouseType: .leftMouseDown, mouseCursorPosition: position , mouseButton: .left) let eventUp = CGEvent(mouseEventSource: source, mouseType: .leftMouseUp, mouseCursorPosition: position , mouseButton: .left) eventDown?.post(tap: .cghidEventTap) //eventDown?.postToPid(71028) usleep(500_000) //eventUp?.postToPid(71028) eventUp?.post(tap: .cghidEventTap) print("Hello, World!")

Puedes verlo funcionando también.


Estabas cerca (Swift 4):

let mousePosition: CGPoint = .zero // your position here let mouseEvent = CGEvent(mouseEventSource: nil, mouseType: .leftMouseDown, mouseCursorPosition: mousePosition, mouseButton: .left) mouseEvent?.postToPid(33554)

Un detalle importante que no se dio cuenta al principio es que la arena de la aplicación debe estar deshabilitada para que esta API funcione.


Publique aquí porque esta pregunta es la más importante en el evento de envío de clics de Google en OS X.

Puede echar un vistazo a los examples de trabajo de drug-n-drop y hacer una función de clic.

Sólo una nota, la ventana donde se va a hacer clic debe estar visible.