2009-09-27 18 views
15

ich den folgenden Code bin mit einem Mausklick zu simulieren:Durchführen einen Doppelklick mit 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); 
} 

ich im Grunde den gleichen Code verwenden kann, eine Steuertaste (rechte Maustaste) zu tun durch Änderung:

kCGEventLeftMouseDown

kCGEventLeftMouseUp

kCGMouseButtonLeft

zu ihren jeweiligen "Richtigen" Ereignissen. Die Funktion sieht ungefähr so ​​aus:

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

Aber, wie etwa ein Doppelklick auf? Ich habe versucht 2 leftclicks Senden und ruft PostMouseEvent() zweimal hintereinander, aber ohne Glück. Wie führen Sie einen Doppelklick aus?

danke!

Antwort

16

Blick in CGEventSetIntegerValueField(event, kCGMouseEventClickState, clickCount). Auch nach der Einstellung von clickCount auf 2 müssen Sie in einigen Fällen möglicherweise 2 Ereignisse für ältere Apps ausführen.

Also im Grunde:

  1. erstellen Ereignis
  2. Set Klick Zahl auf 2
  3. Set Ereignistyp MouseDown- und
  4. Set Ereignistyp senden
  5. Repeat 3 und 4 mouseup und senden

Bearbeiten:

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

wie: CGEventSetIntegerValueField (kCGMouseButtonLeft, kCGEventLeftMouseDown, 2) muss ich es danach auf 1 zurücksetzen? – Uri

+1

Sie müssen einen Verweis auf das eigentliche Ereignisobjekt übergeben, in Ihrem Fall an "theEvent" als ersten Parameter. An diesem Punkt, dass Click gräflichen Ereignis wird auf 2 gesetzt, und Sie wollen es für alle 4 CGEventPosts bis 2 verlassen, die Sie tun müssen, (unten, oben, unten, oben). – phoebus

+0

wie folgt aus: CGEventSetIntegerValueField (kCGEventLeftMouseDown, kCGMouseEventClickState, 2); ich mehrere Warnung bekommen ... können Sie einen Ausschnitt posten? Vielen Dank! – Uri

3

Dies ist Beispielcode einen Doppelklick zu simulieren.

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

Beachten Sie, dass CGEventSetIntegerValueField(theEvent, kCGMouseEventClickState, 2); nach dem ersten Satz nach unten geht, bis Klicks.