Выполнение двойного щелчка с помощью 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);
}

Я могу использовать в основном один и тот же код, чтобы сделать управляющий щелчок (правый щелчок), изменив

kCGEventLeftMouseDown

kCGEventLeftMouseUp

kCGMouseButtonLeft

к их соответствующим "Правильным" событиям. Функция выглядит примерно так:

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

Но как насчет двойного щелчка? Я попытался отправить 2 левых клика и вызвать PostMouseEvent() дважды подряд, но безуспешно. Как вы выполняете двойной щелчок?

Спасибо!

2 ответа

Решение

Заглянуть в CGEventSetIntegerValueField(event, kCGMouseEventClickState, clickCount), Кроме того, даже после установки для ClickCount значения 2 в некоторых случаях может потребоваться выполнить 2 события для устаревших приложений.

Итак, в основном:

  1. Создать событие
  2. Установите количество кликов на 2
  3. Установите тип события на mousedown и отправьте
  4. Установите тип события на mouseup и отправьте
  5. Повторите 3 и 4

Редактировать:

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); 
}

Это пример кода для имитации двойного щелчка.

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); 

Заметить, что CGEventSetIntegerValueField(theEvent, kCGMouseEventClickState, 2);идет после первого набора вниз, щелчков вверх.

Другие вопросы по тегам