Realizando um clique duplo usando CGEventCreateMouseEvent ()
-
18-09-2019 - |
Pergunta
Eu estou usando o seguinte código para simular um clique do 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);
}
Eu posso usar basicamente o mesmo código para fazer um controle do mouse (clique direito), alterando:
kCGEventLeftMouseDown
kCGEventLeftMouseUp
kCGMouseButtonLeft
para seus respectivos eventos "direito". A função é algo como:
void RightClick(const CGPoint point)
{
PostMouseEvent(kCGMouseButtonRight, kCGEventMouseMoved, point);
NSLog(@"Click Right");
PostMouseEvent(kCGMouseButtonRight, kCGEventRightMouseDown, point);
PostMouseEvent(kCGMouseButtonRight, kCGEventRightMouseUp, point);
}
Mas, e quanto a um duplo clique? Eu tentei enviar 2 leftclicks e chamando PostMouseEvent () duas vezes seguidas, mas sem sorte. Como você executar um duplo clique?
Obrigado!
Solução
Olhe em CGEventSetIntegerValueField(event, kCGMouseEventClickState, clickCount)
. Além disso, mesmo depois de definir o clickCount a 2, você pode ter que executar 2 eventos em alguns casos, para aplicações legadas.
Então, basicamente:
- Criar evento
- Set clique contagem para 2
- Definir tipo de evento para mouseDown e enviá
- Definir tipo de evento para mouseup e enviar
- Repita 3 e 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);
}
Outras dicas
Este é o código de exemplo para simular um clique duplo.
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);
Observe que CGEventSetIntegerValueField(theEvent, kCGMouseEventClickState, 2);
goes após o primeiro conjunto de baixo, para cima cliques.