让鼠标进入视网膜坐标

时间:2014-02-22 02:56:12

标签: objective-c macos

我一直在使用[NSEvent mouseLocation]来获取常规屏幕上鼠标的当前位置。我注意到当我升级并使用Retina屏幕时,我得到point coordinates而不是pixel coordinates。我理解为什么会有所不同,但我真的想在pixel coordinates中获得鼠标坐标。

为此,我只需使用scalingFactor翻译mouse coordinates即可。或者有更简洁的方法吗?

感谢任何帮助。

解决方案

NSPoint location = [NSEvent mouseLocation];

for (id screen in [NSScreen screens]) {
    if (NSMouseInRect(location, [screen frame], NO)) {
        NSSize size = {1, 1};
        NSRect mouseRect = {location, size};
        NSRect retinaMouseRect = [screen convertRectToBacking:mouseRect];

        NSLog(@"Mouse Rect = %@", NSStringFromRect(mouseRect));
        NSLog(@"Retina Mouse Rect = %@", NSStringFromRect(retinaMouseRect));
    }
}

1 个答案:

答案 0 :(得分:2)

遍历[NSScreen screens]中的屏幕,找到NSMouseInRect(mouseLocation, [screen frameRect], NO)为真的屏幕。从鼠标位置点创建NSRect,可能使用(1,1)的大小。然后执行[screen convertRectToBacking:rect]将其转换为屏幕的帧缓冲坐标。

注意,这是相对于该屏幕的原点,而不是所有屏幕所在的全局坐标空间。全局坐标空间以点为单位,因此没有明确的方法来计算全局物理坐标。例如,考虑用户在哪里有四个屏幕,一个在左边,两个在中间(一个在另一个的顶部),第四个在右边。假设左侧显示是主显示,因此是全局坐标空间的原点。假设中间的两个点的尺寸相同,但一个是高分辨率而另一个不是。假设光标位于右侧显示屏上。右侧显示器的物理全局坐标应该是多少?它应该是主显示屏的右边缘加上顶部中间显示屏或底部中间显示屏的像素宽度吗?