2015-11-25 2 views
0

Я пытаюсь имитировать действие мыши с помощью программирования.Simulate Click and Drag in OS X

Я не в состоянии сделать нажмите и перетащите действие надежно.

Для мыши и тащите я делаю следующие действия в указанном порядке, указанный ниже

  1. сообщения левой кнопки мыши события в текущей позиции указателя мышей (только один раз)
  2. Переместить мышь (как мышь вниз событие уже отправлено, оно должно действовать как мышь вниз и перетащить, выбирая текст из начальной позиции мыши)
  3. Опубликовать левую кнопку мыши, чтобы завершить действие мыши.

В приложениях с яблоками, таких как Xcode или Safari, этот метод не работает надежно (он выделяет текст при перетаскивании, но с помощью фактической мыши я могу выделить текст нажатием и перетаскиванием). Невозможно перетаскивать значки.

Однако в Firefox эта техника работает. Выбор следует за мышью! То есть, когда мы перемещаем указатель мыши, выбор также изменяется соответствующим образом, и это то, что мне нужно.

Ниже приведен код, который я использую для отправки событий касания мыши.

-(void)_sendMouseEvent:(int)mouseEvent withMouseButton:(CGMouseButton)mouseBtn 
{ 
    CGEventRef ourEvent = CGEventCreate(NULL); 
    NSPoint mouseLoc = CGEventGetLocation(ourEvent); //get current mouse position 

    CGEventRef mouseClick = CGEventCreateMouseEvent(
                NULL, 
                mouseEvent, 
                mouseLoc, 
                mouseBtn 
                ); 
    CGEventPost(kCGHIDEventTap, mouseClick); 
    CFRelease(ourEvent); 
    CFRelease(mouseClick); 
} 

Я попытался отправить события мыши вниз через регулярные промежутки времени, но не изменился.

Есть ли у вас идеи о том, что я делаю неправильно? Пожалуйста, предложите любые обходные пути, которые приходят вам на ум.

ответ

1

Я узнал, что нам нужно сначала отправить событие мыши kCGEventLeftMouseDragged, чтобы начать перетаскивание и выбор.

[self _sendMouseEvent:kCGEventLeftMouseDragged withMouseButton:kCGMouseButtonLeft]; //Start draging. 

-(void)_sendMouseEvent:(int)mouseEvent withMouseButton:(CGMouseButton)mouseBtn 
{ 
    CGEventRef ourEvent = CGEventCreate(NULL); 
    NSPoint mouseLoc = CGEventGetLocation(ourEvent); //get current mouse position 

    CGEventRef mouseClick = CGEventCreateMouseEvent(
                NULL, 
                mouseEvent, 
                mouseLoc, 
                mouseBtn 
                ); 
    CGEventPost(kCGHIDEventTap, mouseClick); 
    CFRelease(ourEvent); 
    CFRelease(mouseClick); 
} 
+0

Как вы это точно реализуете, я имею в виду, какое место вы переходите в mouseLoc? просто текущая позиция, которую он не перетаскивает. –

+0

Присутствует настоящая мышь, и только это делает этот код, так это то, что он стимулирует нажатие кнопки и инициирует событие перетаскивания 'kCGEventLeftMouseDragged'. Поэтому после отправки перетаскиваемых и нажатых кнопок события **, указатель перемещается фактической мышью **. Когда мышь перемещается после отправки событий, выбранный объект перемещается в текущую позицию указателя или выбирает текст (щелчок и перетаскивание). Как только перетаскивание заканчивается, выдается сообщение о выпуске кнопки и перетаскивание остановленных событий. – matt007

+0

поэтому мне нужно отправить> = 3 события: kCGEventLeftMouseDown (start_x, start_y), n x kCGEventLeftMouseDragged (i <= n, end_i_x, end_ i_y), kCGEventLeftMouseUp (end_n_x, end_n_y). Я написал это, и это работает, но мне нужно спать между mouse_down, mouse_drag, mouse_drag, mouse_up не менее 10 мс! Если я не сплю, это не сработает правильно. Зачем? –