我正在開發一個對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參考)和往常一樣接近無用(或者至少缺少必要的細節)。
謝謝!