【问题标题】:Mac OS X: CGGetLastMouseDelta and moving the mouse programaticallyMac OS X:CGGetLastMouseDelta 和以编程方式移动鼠标
【发布时间】:2009-04-10 13:17:48
【问题描述】:

我正在开发 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 参考)像往常一样几乎没有用(或者至少,缺乏必要的细节)。

谢谢!

【问题讨论】:

    标签: macos events mouse


    【解决方案1】:

    一个好主意可能是使用CGAssociateMouseAndMouseCursorPosition(0) 断开鼠标移动与光标的连接。那么你就不会遇到屏幕边界的问题了。

    【讨论】:

      【解决方案2】:

      选项 (1) 生成您自己的事件,指定您导致鼠标移动。
      选项 (2) 从 I move the mouse 例程调用您的鼠标移动事件处理函数。

      【讨论】:

        猜你喜欢
        • 2010-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多