在OS X中以编程方式模拟鼠标input
有没有可能在OS X中模拟鼠标的动作? 具体来说,简短的版本是,我试图模拟使用两个摄像头的触摸屏。 所以假设我可以得到X,Y的位置,我可以发送信息到操作系统作为鼠标移动或点击?
编辑 – 或者,如果在另一个操作系统中特别容易,我愿意考虑这一点。
对的,这是可能的。 您可以使用Quartz事件服务来模拟input事件。
假设C,我写了这个简单的例子:
#include <ApplicationServices/ApplicationServices.h> #include <unistd.h> int main() { // Move to 200x200 CGEventRef move1 = CGEventCreateMouseEvent( NULL, kCGEventMouseMoved, CGPointMake(200, 200), kCGMouseButtonLeft // ignored ); // Move to 250x250 CGEventRef move2 = CGEventCreateMouseEvent( NULL, kCGEventMouseMoved, CGPointMake(250, 250), kCGMouseButtonLeft // ignored ); // Left button down at 250x250 CGEventRef click1_down = CGEventCreateMouseEvent( NULL, kCGEventLeftMouseDown, CGPointMake(250, 250), kCGMouseButtonLeft ); // Left button up at 250x250 CGEventRef click1_up = CGEventCreateMouseEvent( NULL, kCGEventLeftMouseUp, CGPointMake(250, 250), kCGMouseButtonLeft ); // Now, execute these events with an interval to make them noticeable 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); return 0; }
并假设GCC,编译:
gcc -o program program.c -Wall -framework ApplicationServices
享受魔法。
如果你不想编译的东西,并正在寻找一个基于shell的工具, Cliclick可能是解决scheme。
Swift
鼠标移动并点击示例:
func mouseMoveAndClick(onPoint point: CGPoint) { guard let moveEvent = CGEvent(mouseEventSource: nil, mouseType: .mouseMoved, mouseCursorPosition: point, mouseButton: .left) else { return } guard let downEvent = CGEvent(mouseEventSource: nil, mouseType: .leftMouseDown, mouseCursorPosition: point, mouseButton: .left) else { return } guard let upEvent = CGEvent(mouseEventSource: nil, mouseType: .leftMouseUp, mouseCursorPosition: point, mouseButton: .left) else { return } moveEvent.post(tap: CGEventTapLocation.cghidEventTap) downEvent.post(tap: CGEventTapLocation.cghidEventTap) upEvent.post(tap: CGEventTapLocation.cghidEventTap) }
这是一个基于jweyrick的答案的工作C程序:
// Compile instructions: // // gcc -o click click.c -Wall -framework ApplicationServices #include <ApplicationServices/ApplicationServices.h> #include <unistd.h> int main(int argc, char *argv[]) { int x = 0, y = 0, n = 1; float duration = 0.1; if (argc < 3) { printf("USAGE: click XY [N] [DURATION]\n"); exit(1); } x = atoi(argv[1]); y = atoi(argv[2]); if (argc >= 4) { n = atoi(argv[3]); } if (argc >= 5) { duration = atof(argv[4]); } CGEventRef click_down = CGEventCreateMouseEvent( NULL, kCGEventLeftMouseDown, CGPointMake(x, y), kCGMouseButtonLeft ); CGEventRef click_up = CGEventCreateMouseEvent( NULL, kCGEventLeftMouseUp, CGPointMake(x, y), kCGMouseButtonLeft ); // Now, execute these events with an interval to make them noticeable for (int i = 0; i < n; i++) { CGEventPost(kCGHIDEventTap, click_down); sleep(duration); CGEventPost(kCGHIDEventTap, click_up); sleep(duration); } // Release the events CFRelease(click_down); CFRelease(click_up); return 0; }