当前位置:  开发笔记 > 编程语言 > 正文

Mac OS X:CGGetLastMouseDelta并以编程方式移动鼠标

如何解决《MacOSX:CGGetLastMouseDelta并以编程方式移动鼠标》经验,为你挑选了0个好方法。

我正在开发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返回的确切规范(何时?).关于这些东西(Quartz参考)的Apple文档通常接近无用(或者至少缺少必要的细节).

谢谢!

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有