跳跃扭曲的光标

时间:2013-01-09 03:59:00

标签: objective-c macos

我正在尝试使用Objective-C沿着任何UI元素之外的路径移动Mac光标的位置(不仅仅是在某个窗口上,而是在整个屏幕周围与鼠标悬停的内容无关)。我不想直接将鼠标扭曲到某个位置,而是逐渐将其移动到那里(即迭代循环,并在每次迭代中将光标向右移动1个像素。)

问题是光标不断地在屏幕的水平中心线上来回跳跃(如果我在y = 289处开始光标,它会跳到y = 511,然后再回到y = 289,所以即使我实际上没有将它移动到任何地方,因为我的屏幕高800像素。

NSPoint mPoint = [NSEvent mouseLocation];
NSPoint mouseWarpLocation = NSMakePoint(mPoint.x, mPoint.y);
CGWarpMouseCursorPosition(mouseWarpLocation);

上面的代码有效地将鼠标扭曲到当前位置,但由于某种原因,光标在水平中心线上来回跳跃。有关为什么或我可以做些什么来修复它的想法?

1 个答案:

答案 0 :(得分:2)

问题是AppKit(提供NSEvent类)和Quartz Display Services(提供CGWarpMouseCursorPosition)使用不同的坐标系统。

在Quartz中,屏幕坐标系的原点位于“主”屏幕的左上角角,这是包含菜单栏的屏幕,Y坐标随着你而增加移动向下屏幕。

在AppKit中,屏幕坐标系的原点位于主屏幕的左下角角落,当您向屏幕移动向上时,Y坐标会增加。

因此,如果您向AppKit询问鼠标位置(在屏幕坐标中),则需要将Y坐标转换为Quartz坐标系,然后再将其传递给Quartz函数。

要转换Y坐标,只需从主屏幕的高度中减去它:

NSPoint point = [NSEvent mouseLocation];
point.y = [NSScreen mainScreen].frame.size.height - point.y;
CGWarpMouseCursorPosition(point);