Моделирование ввода мыши программно в OS X
можно ли имитировать действия мыши из программы в OS X? В частности, короткая версия заключается в том, что я пытаюсь имитировать сенсорный экран с помощью двух веб-камер. Итак, предполагая,что я могу получить позиции X, Y, могу ли я отправить информацию в ОС как движение мыши или щелчок?
Edit-или если это особенно легко в другой операционной системе, я был бы готов рассмотреть это.
4 ответа:
Да, это возможно. Вы можете использовать Quartz Event Services для имитации входных событий.
предполагая 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
наслаждайтесь магией.
Если вы не хотите компилировать вещи и ищете инструмент на основе оболочки,Cliclick может быть решением.
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) }
вот рабочая программа C, основанная на ответе jweyrick:
// 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 X Y [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; }
размещено в https://gist.github.com/Dorian/5ae010cd70f02adf2107