2010-03-03 14 views
7

Estoy escribiendo una aplicación para Mac OS X 10.6 y posterior en C++. Una parte de la aplicación necesita simular el movimiento del mouse y clics del mouse. Hago esto actualmente publicando objetos CGEvent usando CGEventPost(kCGHIDEventTap, event);.Simular clics del mouse en Mac OS X no funciona para algunas aplicaciones

Esto funciona, en su mayor parte, puedo simular el movimiento del mouse y clics muy bien, pero parece fallar en algunas áreas. Por ejemplo:

  • En Mozilla Firefox y Safari, puedo hacer clic en todos los menús, pero no puedo hacer clic en un enlace dentro de un sitio web. Cuando intento, el enlace se resalta, pero el navegador nunca sigue el enlace. Sin embargo, puedo hacer clic derecho en un enlace, seleccionar "abrir enlace en una pestaña nueva" y todo funciona como se espera. Resuelto - crear el evento del mouse usando CGEventCreateMouseEvent(...) hace que el evento funcione dentro del navegador web.
  • Puedo hacer clic en el icono "Tablero" para abrir el panel, pero no puedo hacer clic en el botón "i" en ninguno de los widgets del tablero. Del mismo modo, al hacer clic en cualquiera de los resultados de búsqueda del widget de búsqueda de Spotlight tampoco funciona.

Esta incoherencia se encuentra a lo largo de los límites de la aplicación. ¿Cuál podría ser la causa?

Respuesta

5

Lo que necesita hacer para convencer a estas aplicaciones de que ha generado un clic es establecer explícitamente el valor del campo "estado de clic" en el evento de mouse up 1 (por defecto es 0). El siguiente código hará:

CGEventSetIntegerValueField(event, kCGMouseEventClickState, 1); 

También tiene que ser puesto a 1 para el ratón hacia abajo, pero mediante el uso de CGEventCreateMouseEvent() en lugar de CGEventCreate() que se hace para usted.

He probado esto y funciona en los botones 'i' en el tablero y en los resultados de búsqueda de Spotlight.

(Dicho sea de paso, si estuviera simulando un doble clic que se necesita para establecer el estado de Pulse para 2 tanto para el ratón y el ratón hasta los acontecimientos de la segunda posición.)

+0

¡Brillante! Eso lo resolvió perfectamente. ¡Muchas gracias! – Thomi

0

Use OSXVnc. Veo que usan CGPostMouseEvent() en lugar de CGPostEvent().

+1

CGPostMouseEvent ha quedado obsoleto en 10.6. Gracias por la sugerencia, pero prefiero no usar las funciones obsoletas. – Thomi

+2

CGPostMouseEvent() se ha reemplazado con CGEventCreateMouseEvent(). ¿Por qué no usar eso? http://developer.apple.com/mac/library/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/c/func/CGEventCreateMouseEvent – Taybin

+0

El cambio de CGEventCreate() para CGEventCreateMouseEvent() tiene Solucionado el problema de Firefox - que es extraño, después de todo estoy configurando los mismos parámetros, pero no el problema del tablero. – Thomi

1

La mayoría de los menús se activan con el evento MouseDown. Los hipervínculos se siguen después del evento mouseUp. El botón "i" solo funciona cuando se hace clic en el mouse pero no hace mucho tiempo. Todo esto parece indicar que tienes un problema de tiempo, prueba varios tiempos presionados.

+0

Esto suena como una pista prometedora. Acabo de cronometrar el espacio entre el envío del mouse hacia abajo y los eventos del mouse: un clic típico tarda 42 mS, lo que me parece debería ser lo suficientemente corto como para generar un clic en lugar de hacer clic y mantener o lo que sea ... – Thomi

+0

De hecho, no es un problema de tiempo. Siempre que establezca el recuento de clics, cualquier temporización razonable servirá. –