1

我正在尝试使用 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);

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

4

1 回答 1

2

问题是 AppKit(提供NSEvent类)和 Quartz 显示服务(提供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);
于 2013-01-09T05:31:27.567 回答