2010-03-03 35 views
7

Tôi đang viết một ứng dụng cho Mac OS X 10.6 trở lên bằng C++. Một phần của ứng dụng cần phải mô phỏng chuyển động của chuột và nhấp chuột. Tôi thực hiện việc này bằng cách đăng các đối tượng CGEvent sử dụng CGEventPost(kCGHIDEventTap, event);.Mô phỏng nhấp chuột trên Mac OS X không hoạt động đối với một số ứng dụng

Tác phẩm này, phần lớn - tôi có thể mô phỏng chuyển động của chuột và nhấp chuột tốt, nhưng có vẻ như không thành công ở một số khu vực. Ví dụ:

  • Trong Mozilla Firefox và Safari, tôi có thể nhấp vào tất cả các menu, nhưng không thể nhấp vào liên kết trong trang web. Khi tôi thử, liên kết được đánh dấu, nhưng trình duyệt không bao giờ theo liên kết. Tuy nhiên, tôi có thể nhấp chuột phải vào liên kết, chọn "liên kết mở trong tab mới" và mọi thứ hoạt động như mong đợi. Giải quyết - tạo sự kiện chuột bằng cách sử dụng CGEventCreateMouseEvent(...) làm cho sự kiện hoạt động trong trình duyệt web.
  • Tôi có thể nhấp vào biểu tượng "Trang tổng quan" để kết thúc trang tổng quan, nhưng tôi không thể nhấp vào nút "i" trên bất kỳ tiện ích bảng điều khiển nào. Tương tự, việc nhấp vào bất kỳ kết quả tìm kiếm nào từ tiện ích tìm kiếm tiêu điểm cũng không hoạt động.

Sự không nhất quán này nằm dọc theo ranh giới ứng dụng. Nguyên nhân có thể là gì?

Trả lời

5

Những gì bạn cần làm để thuyết phục các ứng dụng mà bạn có trong thực tế tạo nhấp chuột là đặt rõ ràng giá trị của trường "trạng thái nhấp chuột" trên sự kiện di chuột lên 1 (mặc định là 0). Các mã sau đây sẽ làm điều đó:

CGEventSetIntegerValueField(event, kCGMouseEventClickState, 1); 

Nó cũng phải được thiết lập để 1 cho chuột xuống, nhưng bằng cách sử dụng CGEventCreateMouseEvent() chứ không phải là CGEventCreate() đó được thực hiện cho bạn.

Tôi đã thử nghiệm tính năng này và hoạt động trong các nút 'i' trong trang tổng quan và kết quả tìm kiếm Spotlight.

(Là một sang một bên, nếu bạn đang mô phỏng một đôi nhấp chuột bạn sẽ cần phải thiết lập trạng thái nhấp chuột để 2 cho cả chuột xuống và chuột lên sự kiện của nhấp chuột thứ hai.)

+0

Tuyệt vời! Điều đó giải quyết nó một cách hoàn hảo. Cảm ơn rất nhiều! – Thomi

0

Sử dụng OSXVnc. Tôi thấy họ sử dụng CGPostMouseEvent() thay vì CGPostEvent().

+1

CGPostMouseEvent đã không được chấp nhận trong 10.6. Cảm ơn bạn đã đề xuất, nhưng tôi không muốn sử dụng các chức năng không dùng nữa. – Thomi

+2

CGPostMouseEvent() đã được thay thế bằng CGEventCreateMouseEvent(). Tại sao không sử dụng? http://developer.apple.com/mac/library/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/c/func/CGEventCreateMouseEvent – Taybin

+0

Thay đổi từ CGEventCreate() thành CGEventCreateMouseEvent() có cố định vấn đề firefox - whcih là lẻ, tôi thiết lập các thông số tương tự sau khi tất cả, nhưng không phải vấn đề bảng điều khiển. – Thomi

1

Hầu hết các menu được kích hoạt với sự kiện mouseDown. Các siêu liên kết được theo sau sự kiện mouseUp. Nút "i" chỉ hoạt động khi chuột đã được nhấp nhưng không phải là một thời gian dài. Tất cả điều này dường như cho thấy rằng bạn có vấn đề về thời gian, hãy thử một số thời gian ép.

+0

Điều này nghe có vẻ như một hướng dẫn đầy hứa hẹn. Tôi vừa mới định thời gian giữa việc gửi chuột xuống và di chuyển chuột lên các sự kiện - một lần nhấp điển hình mất 42 mS, dường như tôi phải đủ ngắn để tạo sự kiện nhấp chứ không phải là nhấp và giữ hoặc bất cứ điều gì ... – Thomi

+0

Thật vậy, nó không phải là một vấn đề thời gian. Miễn là bạn đặt số lần nhấp, mọi thời gian hợp lý sẽ thực hiện. –

Các vấn đề liên quan