gpt4 book ai didi

macos - Mac OS X : CGGetLastMouseDelta and moving the mouse programatically

转载 作者:行者123 更新时间:2023-12-04 15:49:28 25 4
gpt4 key购买 nike

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

谢谢!

最佳答案

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

关于macos - Mac OS X : CGGetLastMouseDelta and moving the mouse programatically,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/737594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com