2009-04-10 28 views
6

Tôi đang phát triển phần mở rộng cho PsychToolbox của MATLAB cho phép kiểm soát tốt hơn chuột trong các thí nghiệm psychophysical (cụ thể, ngăn cản ranh giới màn hình hạn chế hoạt động kéo ... như bạn có thể di chuyển chuột "vô hạn" theo mọi hướng). Kể từ MATLAB không hỗ trợ việc tạo ra các chủ đề bổ sung (và đó sẽ là không cần thiết phức tạp cho tình huống này anyway), tôi không thể sử dụng hoặc là các nhà quản lý sự kiện Carbon hoặc Cocoa.Mac OS X: CGGetLastMouseDelta và di chuyển chuột theo chương trình

CGGetLastMouseDelta là gần như hoàn hảo cho những gì tôi cần phải làm gì (nó được tôi số tiền mà chuột đã chuyển "nhật kể từ lần sự kiện di chuyển chuột nhận bởi ứng dụng" bỏ qua ranh giới màn hình), tuy nhiên có một vấn đề nhỏ. Khi di chuyển chuột theo chương trình (sử dụng CGWarpMouseCursorPosition hoặc CGDisplayMoveCursorToPoint), không có sự kiện nào được tạo. Do đó, CGGetLastMouseDelta dường như không nhận thức được rằng chuột đã di chuyển. Nói cách khác, nếu tôi di chuyển chuột 50 pixel và 50 pixel theo chương trình, CGGetLastMouseDelta sẽ trả lại (0, 0) sau đó cho đồng bằng chuột. Đây là hành vi không mong muốn trong bối cảnh của tôi, và đòi hỏi cách giải quyết xấu. Tôi đã cố gắng di chuyển chuột bằng cách đăng các sự kiện thông qua hệ thống sự kiện, như sau (đây là một "mexFunction", cách MATLAB gọi code C):

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { 
    CGEventRef event; 
    CGPoint offset; 
    CGPoint currentLocation; 
    CGPoint newLocation; 

    if (nrhs != 2) 
     mexErrMsgTxt("The global x and y coordinates (and only those) must be supplied."); 

    event = CGEventCreate(NULL); 
    currentLocation = CGEventGetLocation(event); 
    CFRelease(event); 

    offset = CGPointMake((CGFloat) mxGetScalar(prhs[0]), (CGFloat) mxGetScalar(prhs[1])); 
    newLocation = CGPointMake(currentLocation.x + offset.x, currentLocation.y + offset.y); 

    event = CGEventCreateMouseEvent(NULL, kCGEventMouseMoved, newLocation, kCGMouseButtonLeft); 
    CGEventPost(kCGHIDEventTap, event); 
    CFRelease(event); 
} 

này vui vẻ di chuyển chuột, nhưng không dường như thay đổi hành vi của CGGetLastMouseDelta. Có ai biết các chi tiết kỹ thuật chính xác về những gì được trả về bởi CGGetLastMouseDelta (và khi nào?). Tài liệu của Apple về công cụ này (tham chiếu Quartz) là như thường lệ gần với vô dụng (hoặc ít nhất, thiếu các chi tiết cần thiết).

Cảm ơn!

Trả lời

2

Một ý tưởng hay có thể là sử dụng CGAssociateMouseAndMouseCursorPosition(0) để ngắt kết nối di chuyển chuột khỏi con trỏ. Sau đó, bạn không gặp vấn đề với ranh giới màn hình.

0

Tùy chọn (1) Tạo sự kiện của riêng bạn xác định rằng bạn đã khiến chuột di chuyển.
Tùy chọn (2) Gọi chức năng xử lý sự kiện được di chuyển chuột của bạn từ Tôi đã di chuyển chuột thường lệ.

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