Click to drag objects on Mac

I used the following code to program click programming on 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);
}

Now I'm trying to click down to be able to drag objects like a scroll bar or application window. I am using the following:

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

When I run the code above, something interesting will happen, when the left mouse button gives nothing, nothing happens, I move the mouse, and the window does not move, however, when I added the mouse up , then the window jumped to the place where I supposedly dragged him. it's kind of OK, however, how can I make a mouse click and drag an object?

Note. I have a whole method to see when the mouse stopped moving, so I can click.

please send the code. Thanks

+5
4

, , - CGEventTap kCGEventMouseMoved kCGEventLeftMouseDragged CGEventTap (, )

, , , .

+3

, , .

, , , kCGEventLeftMouseDragged, kCGEventMouseMoved LeftMouseDown LeftMouseUp. , .

+3

Although in PyObjC it works like an ad. But you can go back to Cocoa if you want.

#!/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
+2
source

I repeated it this way in 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);
    }

But I ran into some problem when doing this one by one. I only work when I add a significant delay between mouse, mouse and mouse calls.

 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
+1
source

All Articles