Нажатие мыши вниз, чтобы перетащить объекты на Mac - PullRequest
5 голосов
/ 30 ноября 2009

Я использовал следующий код для программной выдачи кликов на 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);
}

Теперь я пытаюсь нажать вниз , чтобы иметь возможность перетаскивать объекты, такие как полоса прокрутки или окно приложения. Я использую следующее:

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

Когда я запускаю код, указанный выше, происходит что-то интересное, когда левая мышь не работает, кажется, ничего не происходит, я двигаю мышь, и окно не перемещается, однако, когда я добавил мышь вверх событие тогда окно прыгнуло к месту где якобы его перетянул. это вроде нормально, однако, как я могу сделать щелчок мыши вниз и перетащить объект?

Примечание: у меня есть целый метод, чтобы увидеть, когда мышь перестала двигаться, чтобы я мог щелкнуть вверх.

пожалуйста, отправьте код. Спасибо

Ответы [ 4 ]

3 голосов
/ 23 апреля 2010

Единственный способ сделать то, что вы хотите, это установить активный CGEventTap, чтобы получить редактируемый поток событий kCGEventMouseMoved и преобразовать их в события kCGEventLeftMouseDragged в обратном вызове CGEventTap (очевидно, вам сначала нужно синтезировать событие нажатия мыши) *

Можно подумать, что это делается автоматически, отправляя событие click без отпускания и перемещая мышь, но это не так.

3 голосов
/ 30 ноября 2009

Чтобы перетащить, вы должны сначала нажать кнопку мыши, а затем переместить мышь.

Программно, вы, вероятно, должны публиковать kCGEventLeftMouseDragged, а не kCGEventMouseMoved, между LeftMouseDown и LeftMouseUp событиями. Вы можете установить собственное событие и регистрировать реальные события мыши, чтобы подтвердить или исправить это.

2 голосов
/ 21 января 2012

Хотя в PyObjC это работает так, как рекламируется. Но вы можете перепроектировать его обратно в Какао, если хотите.

#!/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 голос
/ 24 августа 2016

Я переопределил это таким образом в Какао в 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);
    }

Но я сталкиваюсь с некоторой проблемой при выполнении его один за другим. Я работаю только тогда, когда добавляю значительную задержку между вызовом мыши вниз, перетаскиванием мышью и мышью вверх.

 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...