我正在开发MATLAB的PsychToolbox的扩展,允许在心理物理实验期间更好地控制鼠标(特别是,防止屏幕边界限制拖动操作......它应该感觉你可以“无限地”移动鼠标八方)。由于MATLAB不支持创建额外的线程(无论如何这对于这种情况会不必要地复杂化),我无法使用Carbon或Cocoa事件管理器。
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返回的确切规格(以及何时?)。 Apple关于这些内容的文档(Quartz参考)与往常一样无用(或者至少缺少必要的细节)。
谢谢!
答案 0 :(得分:2)
一个好主意可能是使用CGAssociateMouseAndMouseCursorPosition(0)
来断开鼠标与光标的移动。然后你不会遇到屏幕边界的问题。
答案 1 :(得分:0)
选项(1)生成您自己的事件,指定您使鼠标移动 选项(2)从移动鼠标例程调用鼠标移动事件处理函数。