OS X: Simulating mouse input programmatically

1 min read Aug 16, 2016

OS X: Simulating mouse input programmatically

玩过远程辅助工具小伙伴应该都对模拟鼠标事件不陌生, 要做到这件事, 可以使用 Quartz Event Services

先来一个 Demo, 首先要引入 ApplicationServices:

#include <ApplicationServices/ApplicationServices.h>

接下来, 要模拟事件, 首先需要创建事件:

CGPoint p1 = CGPointMake(500, 500);
CGPoint p2 = CGPointMake(700, 700);

// Move to p1
CGEventRef move1 = CGEventCreateMouseEvent(
    NULL, kCGEventMouseMoved, p1,
    kCGMouseButtonLeft // ignored
);
// Move to p2
CGEventRef move2 = CGEventCreateMouseEvent(
    NULL, kCGEventMouseMoved, p2,
    kCGMouseButtonLeft // ignored
);
// Left button down at p2
CGEventRef click1_down = CGEventCreateMouseEvent(
    NULL, kCGEventLeftMouseDown, p2,
    kCGMouseButtonLeft
);
// Left button up at p2
CGEventRef click1_up = CGEventCreateMouseEvent(
    NULL, kCGEventLeftMouseUp, p2,
    kCGMouseButtonLeft
);

上面我们创建了两个坐标点, 并创建了移动鼠标和鼠标左键按下、放开的事件。

现在, 执行它们:

// Execute events
CGEventPost(kCGHIDEventTap, move1);
sleep(1);
CGEventPost(kCGHIDEventTap, move2);
sleep(1);
CGEventPost(kCGHIDEventTap, click1_down);
CGEventPost(kCGHIDEventTap, click1_up);

// Release the events
CFRelease(click1_up);
CFRelease(click1_down);
CFRelease(move2);
CFRelease(move1);

我们分别执行了前面创建的四个事件, 为了让显示效果更明显, 我们在执行事件的代码之间加入了 sleep()

事件执行之后, 不要忘记进行释放。

Picsew | Ezra