2009-04-10 109 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)从中调用鼠标移动的事件处理函数我移动了鼠标例程。