2009-11-30 13 views
5

Sto usando il seguente codice di emettere clic a livello di codice su un MacFacendo clic sul mouse per trascinare gli oggetti su Mac

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

Ora, sto cercando di fare clic giù per essere in grado di trascinare oggetti, come una barra di scorrimento o una finestra dell'applicazione. Sto usando il seguente:

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

Quando ho eseguito il codice di cui sopra qualcosa di interessante accadrà, quando il sinistro del mouse verso il basso è questione non sembrano accadere, muovo il mouse e la finestra non si muove, però quando ho aggiunto un mouse fino all'evento, la finestra è saltata nella posizione in cui presumibilmente l'ho trascinata. questo è un po 'OK, tuttavia, come posso fare clic con il mouse e trascinare un oggetto?

Nota: ho un intero metodo per vedere quando il mouse si è fermato, quindi posso fare clic su.

per favore inserire il codice. Grazie

risposta

3

L'unico modo per fare quello che vuoi è la fissazione di un CGEventTap attiva per ottenere un flusso modificabile di eventi kCGEventMouseMoved e trasformarli in eventi kCGEventLeftMouseDragged nel callback del CGEventTap (ovviamente è necessario per sintetizzare prima l'evento mouse down)

Si potrebbe pensare che ciò avvenga automaticamente inviando un evento click senza rilascio e spostando il mouse ma non è questo il caso.

+1

quindi, ummm, tipo, come lo fai, lol. –

+0

CGEventSetType (evento, kCGEventLeftMouseDragged) – valexa

3

Per trascinare, è necessario innanzitutto premere il pulsante del mouse, quindi spostare il mouse.

livello di programmazione, probabilmente si dovrebbe inserire kCGEventLeftMouseDragged, non kCGEventMouseMoved, tra le LeftMouseDown e LeftMouseUp eventi. È possibile installare un evento personalizzato toccare e registrare eventi del mouse reale per confermare o correggere questo.

+1

Continuo a vedere lo stesso comportamento quando si utilizza kCGEventLeftMouseDragged. Qualche possibilità puoi darmi un frammento? Sono sicuro che sto facendo qualcosa di sbagliato. Grazie! – Uri

+1

Ok, ho provato a creare un evento con CGEventCreateMouseEvent() ma continuo a vedere lo stesso comportamento ... – Uri

+1

Chiunque? Nessuno ha una risposta? – Uri

2

Anche se in PyObjC, funziona come pubblicizzato. Ma puoi decodificarlo di nuovo a Cocoa, se lo desideri.

#!/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

ho reimplementato in questo modo a Cocoa in C:

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

Ma ho incontrato qualche problema con l'esecuzione di uno per uno. Funziono solo quando aggiungo un ritardo significativo tra l'invocazione del mouse, il trascinamento del mouse e il mouse su.

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 
Problemi correlati