2009-09-27 7 views
15

Używam poniższy kod, żeby zasymulować kliknięcie myszy:Wykonywanie podwójnego kliknięcia korzystając 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); 
} 

mogę użyć w zasadzie ten sam kod, aby zrobić Control (prawy przycisk myszy) poprzez zmianę:

kCGEventLeftMouseDown

kCGEventLeftMouseUp

kCGMouseButtonLeft

do odpowiednich zdarzeń "właściwych". Funkcja wygląda następująco:

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

Ale co powiesz na podwójne kliknięcie? Próbowałem wysłać dwa lewe kliknięcia i wywołać PostMouseEvent() dwa razy z rzędu, ale bez powodzenia. Jak wykonać podwójne kliknięcie?

dziękuję!

Odpowiedz

16

Sprawdź w CGEventSetIntegerValueField(event, kCGMouseEventClickState, clickCount). Ponadto, nawet po ustawieniu clickCount na 2, w niektórych przypadkach może być konieczne wykonanie 2 zdarzeń w przypadku starszych aplikacji.

Więc zasadniczo:

  1. Utwórz wydarzenie
  2. Set Kliknij liczyć na 2
  3. Ustaw typ zdarzenia do mouseDown i wysłać
  4. zestaw typ zdarzenia do mouseup i wysłać
  5. Powtórz 3 i 4

Edytuj:

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

podobne: CGEventSetIntegerValueField (kCGMouseButtonLeft, kCGEventLeftMouseDown, 2) Czy muszę zresetować go do 1 po tym? – Uri

+1

Musisz przekazać odniesienie do rzeczywistego obiektu zdarzenia, w twoim przypadku do "theEvent", jako pierwszy parametr. W tym momencie licznik kliknięć tego wydarzenia jest ustawiony na 2, a użytkownik chce pozostawić go na poziomie 2 dla wszystkich 4 CGEventPosts, które należy wykonać (w dół, w górę, w dół, w górę). – phoebus

+0

podobnie jak to: CGEventSetIntegerValueField (kCGEventLeftMouseDown, kCGMouseEventClickState, 2); Otrzymuję kilka ostrzeżeń ... Czy możesz zamieścić krótki opis? dzięki! – Uri

3

Oto przykładowy kod symulujący podwójne kliknięcie.

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

Należy zauważyć, że CGEventSetIntegerValueField(theEvent, kCGMouseEventClickState, 2); przechodzi po pierwszym zestawie kliknięć w dół.

Powiązane problemy