我正在开发一个对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参考)和往常一样接近无用(或者至少缺少必要的细节)。
谢谢!