我已经在 C 的 Cocoa 中以这种方式重新实现了它:
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