Выполнение двойного щелчка с помощью 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(), но безуспешно. Как вы выполняете двойной щелчок?

Благодарность!


person Uri    schedule 27.09.2009    source источник


Ответы (2)


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

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

  1. Создать событие
  2. Установите количество кликов на 2
  3. Установите тип события на mousedown и отправьте
  4. Установите тип события на наведение мыши и отправку
  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); 
}
person phoebus    schedule 27.09.2009
comment
например: CGEventSetIntegerValueField(kCGMouseButtonLeft, kCGEventLeftMouseDown, 2) нужно ли после этого сбросить его до 1? - person Uri; 27.09.2009
comment
Вам нужно передать ссылку на фактический объект события, в вашем случае на theEvent, в качестве первого параметра. В этот момент для счетчика кликов этого события установлено значение 2, и вы хотите оставить его равным 2 для всех 4 CGEventPosts, которые вам нужно выполнить (вниз, вверх, вниз, вверх). - person phoebus; 27.09.2009
comment
примерно так: CGEventSetIntegerValueField(kCGEventLeftMouseDown, kCGMouseEventClickState, 2); Я получаю несколько предупреждений... можете опубликовать фрагмент? Благодарность! - person Uri; 27.09.2009
comment
Спасибо. Одна проблема, как только вы выполните двойной щелчок, он больше нигде не щелкнет. Я передаю в качестве параметра текущее местоположение мыши (точки), но он по-прежнему выполняет двойной щелчок по той же точке, что и раньше, или по тому же приложению, независимо от того, имеет ли оно фокус. Я предполагаю, что clickCount равен 2, верно? это нигде не заявлено. - person Uri; 28.09.2009
comment
Я добавил CGEventSetType(theEvent, kCGEventLeftMouseDown); CGEventPost(kCGHIDEventTap, theEvent); потому что я думал, что он отсутствует, но это не проблема - person Uri; 28.09.2009
comment
Вам не нужно публиковать событие дважды с clickCount == 2, только один раз. Другими словами, опубликуйте MouseDown с clickCount = 2, затем MouseUp с clickCount = 2, и все готово. Я только что проверил это (на самом деле мой код отправляет первый Down/Up со значением count=1, но второй вызывает двойной щелчок по желанию). - person Jared Updike; 08.01.2011
comment
У меня это работает в iTerm2, но не в Finder или других приложениях. Это в значительной степени работает только в iTerm2. Есть идеи, почему? - person Jason Stallings; 28.04.2015
comment
хорошо, это работает, но при тестировании в IntelliJ Clion мне нужно добавить один щелчок перед двойным щелчком, чтобы окно Clion сначала получило фокус - person Michał Ziobro; 21.08.2016

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

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); идет после первого набора кликов вниз, вверх.

person Tom Dev    schedule 10.03.2011