Esecuzione di un doppio clic utilizzando CGEventCreateMouseEvent ()
-
18-09-2019 - |
Domanda
Sto utilizzando il seguente codice per simulare un clic del mouse:
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);
}
posso usare fondamentalmente lo stesso codice per fare un controllo-click (click destro) cambiando:
kCGEventLeftMouseDown
kCGEventLeftMouseUp
kCGMouseButtonLeft
per i rispettivi eventi "Destra". La funzione simile a:
void RightClick(const CGPoint point)
{
PostMouseEvent(kCGMouseButtonRight, kCGEventMouseMoved, point);
NSLog(@"Click Right");
PostMouseEvent(kCGMouseButtonRight, kCGEventRightMouseDown, point);
PostMouseEvent(kCGMouseButtonRight, kCGEventRightMouseUp, point);
}
Ma, come su un doppio click? Ho provato l'invio di 2 leftclicks e chiamando PostMouseEvent () due volte di fila, ma senza fortuna. Come si esegue un doppio click?
grazie!
Soluzione
Se vuoi in CGEventSetIntegerValueField(event, kCGMouseEventClickState, clickCount)
. Inoltre, anche dopo aver impostato il clickCount a 2, si potrebbe essere necessario eseguire 2 eventi, in alcuni casi, per le applicazioni legacy.
Quindi, in pratica:
- Crea evento
- Imposta conteggio clicca per 2
- Imposta tipo di evento da MouseDown e inviare
- Imposta tipo di evento da MouseUp e inviare
- Ripeti 3 e 4
Modifica:
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);
}
Altri suggerimenti
Questo è il codice di esempio per simulare un doppio 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);
Si noti che CGEventSetIntegerValueField(theEvent, kCGMouseEventClickState, 2);
goes dopo la prima serie di giù, su clic.