2009-04-10 113 views
6

我正在開發一個對MATLAB的PsychToolbox的擴展,它允許在心理物理實驗期間更好地控制鼠標(特別是防止屏幕邊界限制拖動操作......它應該感覺就像你可以在任何方向上「無限」地移動鼠標一樣)。由於MATLAB不支持創建額外的線程(無論如何這對於這種情況來說都是不必要的複雜),所以我無法使用Carbon或Cocoa事件管理器。Mac OS X:CGGetLastMouseDelta並以編程方式移動鼠標

CGGetLastMouseDelta是什麼,我需要做的近乎完美的(它讓我的鼠標移動量「,因爲應用程序收到的最後一個鼠標移動事件」忽略屏幕邊界),但有一個小問題。以編程方式移動鼠標時(使用CGWarpMouseCursorPosition或CGDisplayMoveCursorToPoint),不會生成任何事件。因此,CGGetLastMouseDelta似乎沒有意識到鼠標已經移動了。換句話說,如果我將鼠標移動50個像素並以編程方式向下移動50個像素,則CGGetLastMouseDelta隨後爲鼠標增量返回(0,0)。這在我的上下文中是不受歡迎的行爲,並且需要醜陋的解決方法。我試圖通過事件系統發佈事件移動鼠標,如下所示(這是一個「mexFunction」,MATLAB的調用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); 
} 

這愉快地移動鼠標,但不似乎根本改變了CGGetLastMouseDelta的行爲。有人知道CGGetLastMouseDelta(何時?)返回的確切規格。蘋果關於這些東西的文檔(Quartz參考)和往常一樣接近無用(或者至少缺少必要的細節)。

謝謝!

回答

2

一個好主意可能是使用CGAssociateMouseAndMouseCursorPosition(0)斷開光標與鼠標的移動。那麼你不會遇到屏幕邊界的問題。

0

選項(1)生成自己的事件,指定您是否使鼠標移動。
選項(2)從中調用鼠標移動的事件處理函數我移動了鼠標例程。