2009-09-27 10 views
15

estoy usando el siguiente código para simular un clic del ratón:Realización de un doble clic desde CGEventCreateMouseEvent()

void PostMouseEvent(CGMouseButton button, CGEventType type, const CGPoint point) 
{ 
CGEventRef theEvent = CGEventCreateMouseEvent(NULL, type, point, button); 
CGEventSetType(theEvent, type); 
CGEventPost(kCGHIDEventTap, theEvent); 
CFRelease(theEvent); 
} 

void LeftClick(const CGPoint point) 
{ 
PostMouseEvent(kCGMouseButtonLeft, kCGEventMouseMoved, point); 
NSLog(@"Click!"); 
PostMouseEvent(kCGMouseButtonLeft, kCGEventLeftMouseDown, point); 
PostMouseEvent(kCGMouseButtonLeft, kCGEventLeftMouseUp, point); 
} 

puedo utilizar básicamente el mismo código para hacer un control y haga clic (clic derecho) cambiando:

kCGEventLeftMouseDown

kCGEventLeftMouseUp

kCGMouseButtonLeft

a sus respectivos eventos "Derecha". La función se parece a algo así como:

void RightClick(const CGPoint point) 
{ 
PostMouseEvent(kCGMouseButtonRight, kCGEventMouseMoved, point); 
NSLog(@"Click Right"); 
PostMouseEvent(kCGMouseButtonRight, kCGEventRightMouseDown, point); 
PostMouseEvent(kCGMouseButtonRight, kCGEventRightMouseUp, point); 
} 

Pero, ¿qué tal un doble clic? Intenté enviar 2 clics hacia la izquierda y llamar a PostMouseEvent() dos veces seguidas, pero no tuve suerte. ¿Cómo se hace un doble clic?

gracias!

Respuesta

16

Mire en CGEventSetIntegerValueField(event, kCGMouseEventClickState, clickCount). Además, incluso después de configurar el clickCount en 2, es posible que deba realizar 2 eventos en algunos casos, para aplicaciones heredadas.

Así que, básicamente:

  1. Crear evento
  2. Conjunto clic recuento de 2
  3. Conjunto tipo de evento para mouseDown y enviar
  4. Conjunto tipo de evento para mouseup y enviar
  5. Repetir 3 y 4

Editar:

void doubleClick(int clickCount) { 
    CGEventRef theEvent = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, point, kCGMouseButtonLeft); 
    CGEventSetIntegerValueField(theEvent, kCGMouseEventClickState, clickCount); 
    CGEventPost(kCGHIDEventTap, theEvent); 
    CGEventSetType(theEvent, kCGEventLeftMouseUp); 
    CGEventPost(kCGHIDEventTap, theEvent); 
    CGEventSetType(theEvent, kCGEventLeftMouseDown); 
    CGEventPost(kCGHIDEventTap, theEvent); 
    CGEventSetType(theEvent, kCGEventLeftMouseUp); 
    CGEventPost(kCGHIDEventTap, theEvent); 
    CFRelease(theEvent); 
} 
+0

como: CGEventSetIntegerValueField (kCGMouseButtonLeft, kCGEventLeftMouseDown, 2) ¿Necesito restablecerlo a 1 después de eso? – Uri

+1

Necesita pasar una referencia al objeto de evento real, en su caso a "theEvent", como el primer parámetro. En ese momento, el recuento de clics de ese evento se establece en 2 y desea dejarlo en 2 para los 4 CGEventPosts que necesita hacer (abajo, arriba, abajo, arriba). – phoebus

+0

de esta manera: CGEventSetIntegerValueField (kCGEventLeftMouseDown, kCGMouseEventClickState, 2); Recibo varias advertencias ... ¿Puedes publicar un fragmento? ¡Gracias! – Uri

3

Este es un código de muestra para simular un doble clic.

CGEventRef theEvent = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, CGPointMake(x, y), kCGMouseButtonLeft); 
CGEventPost(kCGHIDEventTap, theEvent); 
CGEventSetType(theEvent, kCGEventLeftMouseUp); 
CGEventPost(kCGHIDEventTap, theEvent); 

CGEventSetIntegerValueField(theEvent, kCGMouseEventClickState, 2); 

CGEventSetType(theEvent, kCGEventLeftMouseDown); 
CGEventPost(kCGHIDEventTap, theEvent); 

CGEventSetType(theEvent, kCGEventLeftMouseUp); 
CGEventPost(kCGHIDEventTap, theEvent); 

CFRelease(theEvent); 

en cuenta que CGEventSetIntegerValueField(theEvent, kCGMouseEventClickState, 2); ocurre después de que el primer grupo de abajo, arriba clics.

Cuestiones relacionadas