2009-11-30 5 views
5

Ich habe den folgenden Code unter Verwendung von Klicks auf einem MacKlicken mit der Maus nach unten Objekte auf dem Mac zu ziehen

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 Click(const CGPoint point) 
{ 
    PostMouseEvent(kCGMouseButtonLeft, kCGEventMouseMoved, point); 
    NSLog(@"Click!"); 
    PostMouseEvent(kCGMouseButtonLeft, kCGEventLeftMouseDown, point); 
    PostMouseEvent(kCGMouseButtonLeft, kCGEventLeftMouseUp, point); 
} 

nun programmatisch zu erteilen, ich versuche unten zu klicken, um den Luftwiderstand zu können, Objekte, wie eine Bildlaufleiste oder ein Anwendungsfenster. Ich verwende die folgenden:

PostMouseEvent(kCGMouseButtonLeft, kCGEventMouseMoved, point); 
NSLog(@"Click Down!"); 
PostMouseEvent(kCGMouseButtonLeft, kCGEventLeftMouseDown, point); 

Wenn ich den Code oben etwas lief interessant passieren wird, wenn die linke Maustaste gedrückt Problem nichts zu passieren scheint, ich meine Maus bewegen und das Fenster nicht bewegt, jedoch als ich eine Maus up Ereignis hinzugefügt, dann sprang das Fenster an den Ort, wo ich es angeblich schleppte. das ist irgendwie OK, aber wie kann ich die Maus klicken und ein Objekt ziehen?

Hinweis: Ich habe eine ganze Methode zu sehen, wenn die Maus nicht mehr bewegt, so dass ich klicken kann.

bitte Postleitzahl. Danke

Antwort

3

Der einzige Weg, was Sie tun möchten, ist eine aktive CGEventTap Einstellung eines bearbeitbaren Strom von kCGEventMouseMoved Ereignisse zu bekommen und sie in kCGEventLeftMouseDragged Ereignisse in den Rückruf des CGEventTap ändern (natürlich Sie die Maus nach unten Ereignis zuerst synthetisieren müssen)

Sie würden denken, dass dies automatisch geschieht, indem Sie ein Klickereignis ohne Freigabe senden und die Maus bewegen, aber das ist nicht der Fall.

+1

also, ähm, wie, wie machst du es, lol. –

+0

CGEventSetType (Ereignis, kCGEventLeftMouseDragged) – valexa

3

Um zu ziehen, müssen Sie zuerst die Maustaste drücken, dann bewegen Sie die Maus.

Programmatisch sollten Sie wahrscheinlich kCGEventLeftMouseDragged, nicht kCGEventMouseMoved, zwischen den Ereignissen LeftMouseDown und LeftMouseUp posten. Sie können ein benutzerdefiniertes Ereignis installieren, indem Sie echte Mausereignisse antippen und protokollieren, um dies zu bestätigen oder zu korrigieren.

+1

Ich sehe immer noch das gleiche Verhalten bei der Verwendung von kCGEventLeftMouseDragged. Gibt es eine Chance, dass Sie mir ein Schnipsel geben können? Ich bin mir sicher, dass ich etwas falsch mache. Vielen Dank! – Uri

+1

Ok, ich habe versucht, ein Ereignis mit CGEventCreateMouseEvent() zu erstellen, aber ich sehe immer noch das gleiche Verhalten ... – Uri

+1

Jeder? Niemand hat eine Antwort? – Uri

2

Obwohl in PyObjC funktioniert dies wie angekündigt. Aber Sie können es zurück nach Cocoa zurückentwickeln, wenn Sie möchten.

#!/usr/bin/python 
import sys, time 
from Quartz.CoreGraphics import * 

def mouseEvent(type, posx, posy): 
    theEvent = CGEventCreateMouseEvent(None, type, (posx,posy), kCGMouseButtonLeft) 
    CGEventPost(kCGHIDEventTap, theEvent) 

def mousemove(posx,posy): 
    mouseEvent(kCGEventMouseMoved, posx,posy) 

def mouseclickdn(posx,posy): 
    mouseEvent(kCGEventLeftMouseDown, posx,posy) 

def mouseclickup(posx,posy): 
    mouseEvent(kCGEventLeftMouseUp, posx,posy) 

def mousedrag(posx,posy): 
    mouseEvent(kCGEventLeftMouseDragged, posx,posy) 

ourEvent = CGEventCreate(None) 
currentpos = CGEventGetLocation(ourEvent) # Save current mouse position 

mouseclickdn(60, 100) 
mousedrag(60, 300) 
mouseclickup(60, 300) 

time.sleep(1) 
mousemove(int(currentpos.x), int(currentpos.y)) # Restore mouse position 
1

Ich habe es auf diese Weise in Cocoa in C neu implementiert:

void mouse_left_click_down_at(float x, float y) { 

      /** 
      * create a new Quartz mouse event. 
      * params: 
      * @source : CGEventSourceRef 
      * @mouseType : CGEventType 
      * @mouseCursorPosition : CGPoint 
      * @mouseButton : CGMouseButton 
     */ 
     CGEventRef left_click_down_event = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, CGPointMake(x, y), 0); 

     /** 
     * post a Quartz event into the event stream at a specified location. 
     * params: 
     * @tap : CGEventTapLocation 
     * @event : CGEventRef 
     */ 
     CGEventPost(kCGHIDEventTap, left_click_down_event); 

     /** 
     * release a Quartz event 
     */ 
     CFRelease(left_click_down_event); 
    } 
    void mouse_left_click_up_at(float x, float y) { 

     /** 
     * create a new Quartz mouse event. 
     * params: 
     * @source : CGEventSourceRef 
     * @mouseType : CGEventType 
     * @mouseCursorPosition : CGPoint 
     * @mouseButton : CGMouseButton 
     */ 
     CGEventRef left_click_up_event = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseUp, CGPointMake(x, y), 0); 

     /** 
     * post a Quartz event into the event stream at a specified location. 
     * params: 
     * @tap : CGEventTapLocation 
     * @event : CGEventRef 
     */ 
     CGEventPost(kCGHIDEventTap, left_click_up_event); 

     /** 
     * release a Quartz event 
     */ 
     CFRelease(left_click_up_event); 
    } 

    void mouse_left_drag_to(float x, float y) { 

     /** 
     * create a new Quartz mouse event. 
     * params: 
     * @source : CGEventSourceRef 
     * @mouseType : CGEventType 
     * @mouseCursorPosition : CGPoint 
     * @mouseButton : CGMouseButton 
     */ 
     CGEventRef left_drag_event = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDragged, CGPointMake(x, y), 0); 

     /** 
     * post a Quartz event into the event stream at a specified location. 
     * params: 
     * @tap : CGEventTapLocation 
     * @event : CGEventRef 
     */ 
     CGEventPost(kCGHIDEventTap, left_drag_event); 

     /** 
     * release a Quartz event 
     */ 
     CFRelease(left_drag_event); 
    } 

Aber ich begegnen einige Problem mit ihm eins nach dem anderen ausgeführt wird. Ich arbeite nur, wenn ich eine signifikante Verzögerung zwischen dem Aufruf von Maus nach unten, Maus ziehen und Maus nach oben hinzufügen.

mouse_left_click_at(400.0, 200.0);   // get focus 
    usleep(10000); 

    mouse_left_click_down_at(400.0, 200.0);  // start dragging 
    usleep(10000); 
    mouse_left_drag_to(500.0, 400.0);   // continue dragging 
    usleep(10000); 
    mouse_left_drag_to(600.0, 500.0); 
    usleep(10000); 
    mouse_left_drag_to(700.0, 600.0); 
    usleep(10000); 
    mouse_left_drag_to(800.0, 700.0); 
    usleep(10000); 
    mouse_left_click_up_at(800.0, 700.0);  // stop dragging 
Verwandte Themen