2009-11-30 37 views
5

Tôi đã sử dụng đoạn mã sau để phát hành nhấp chuột lập trình trên máy MacNhấp chuột xuống để kéo các đối tượng trên 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); 
} 

Bây giờ, tôi đang cố gắng để nhấp xuống để có thể kéo các đối tượng, như thanh cuộn hoặc cửa sổ của ứng dụng. Tôi đang sử dụng như sau:

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

Khi tôi chạy mã trên không có gì thú vị xảy ra, tôi di chuyển chuột và cửa sổ không di chuyển, tuy nhiên khi tôi thêm chuột lên sự kiện thì cửa sổ nhảy đến vị trí mà tôi cho là đã kéo nó. đây là loại OK, tuy nhiên, làm thế nào để tôi có thể làm cho các nhấp chuột và kéo xuống một đối tượng?

Lưu ý: Tôi có toàn bộ phương pháp để xem khi nào chuột ngừng di chuyển để tôi có thể nhấp lên.

vui lòng đăng mã. Cảm ơn

Trả lời

3

Cách duy nhất để làm những gì bạn muốn là thiết lập một CGEventTap tích cực để có được một dòng suối có thể chỉnh sửa các sự kiện kCGEventMouseMoved và thay đổi chúng thành các sự kiện kCGEventLeftMouseDragged trong callback của CGEventTap (rõ ràng bạn cần phải tổng hợp các sự kiện chuột xuống đầu tiên)

Bạn sẽ nghĩ rằng thao tác này được thực hiện tự động bằng cách gửi sự kiện nhấp chuột mà không cần thả và di chuyển chuột nhưng điều đó không đúng.

+1

vậy, ummm, như thế nào, bạn làm thế nào, lol. –

+0

CGEventSetType (sự kiện, kCGEventLeftMouseDragged) – valexa

3

Để kéo, bạn phải đặt nút chuột xuống trước, sau đó di chuyển chuột.

Có lập trình, có thể bạn nên đăng kCGEventLeftMouseDragged, chứ không phải kCGEventMouseMoved, giữa các sự kiện LeftMouseDownLeftMouseUp. Bạn có thể cài đặt một sự kiện tùy chỉnh chạm và ghi lại các sự kiện chuột thực để xác nhận hoặc sửa lỗi này.

+1

Tôi vẫn thấy hành vi tương tự khi sử dụng kCGEventLeftMouseDragged. Bất kỳ cơ hội nào bạn có thể cho tôi một đoạn mã? Tôi chắc chắn tôi đang làm điều gì sai. Cảm ơn! – Uri

+1

Ok, tôi đã thử tạo sự kiện với CGEventCreateMouseEvent() nhưng tôi vẫn thấy hành vi tương tự ... – Uri

+1

Bất kỳ ai? Không ai có câu trả lời? – Uri

2

Mặc dù trong PyObjC, tính năng này hoạt động như được quảng cáo. Nhưng bạn có thể đảo ngược kỹ sư nó trở lại Cocoa nếu bạn muốn.

#!/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

Tôi đã reimplemented nó theo cách này trong Cocoa trong 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); 
    } 

Nhưng tôi gặp phải một số vấn đề với việc thực hiện nó từng cái một. Tôi chỉ hoạt động khi tôi thêm một số độ trễ đáng kể giữa yêu cầu di chuột xuống, kéo chuột và di chuột lên.

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 
Các vấn đề liên quan