因此,我需要能够移动鼠标到任何给定的点(x和y)。我试图用CGDisplayMoveCursor来完成它,当它移动游标时,它并没有把它放在我期望的地方。我的装备里有两台监视器。我通过NSScreen.screensi.frame获得帧,这些是他们的帧。
Built-in Retina Display
NSRect (0.0, 0.0, 1440.0, 900.0)
SwitchResX4 - LG HDR WQHD
NSRect (-1186.0, 900.0, 3840.0, 1600.0)然后,当我收到新的点时,我使用NSRect.contains(NSPoint)来查找这两个监视器中的哪一个包含这个点。这部分如预期的那样工作。
但是,我想把光标移到那个点,但是它不像您所期望的那样工作(光标移动,而不是像您根据框架所期望的那样移动到点)。这是密码。
let point = NSPoint(x: x, y: y)
guard let monitor = Monitor.displayIdWithPoint(point) else {
SendlogCallbackEvent("D", "", "Found nil in monitor with point", #function, #file, #line)
}
if CGDisplayMoveCursorToPoint(monitor.directDisplayId, point) == CGError.failure {
SendlogCallbackEvent("D", "", "CGError.failer to move cursor", #function, #file, #line)
}我读过,它可能与CG和NS如何以不同的方式处理坐标系有关,但我一直无法弄清楚如何使它工作。我如何将我的NSPoint“转换”成一个CGPoint,以便它与CGDisplayMove一起工作.函数。或者什么是最好的方法。
发布于 2021-05-18 18:35:25
这段代码片段:
let point = NSPoint(x: x, y: y)
guard let monitor = Monitor.displayIdWithPoint(point) else {
SendlogCallbackEvent("D", "", "Found nil in monitor with point", #function, #file, #line)
}给我的印象是,您正在查找的point是窗口系统坐标空间中的一个点(描述这两个窗口框架的坐标空间)。
但是,看看CGDisplayMoveCursorToPoint(_:_:)的文档,我们看到(强调我的):
点
点在本地显示空间中的坐标。原点是指定显示的左上角.
因此,我认为您需要使用您的point,并对其进行转换,以便它相对于您想要的显示的起源:
let pointRelativeToScreen = point - monitor.frame.origin
if CGDisplayMoveCursorToPoint(monitor.directDisplayId, pointRelativeToScreen) == CGError.failure { ... }或者,可能还有其他一些API,它期望在窗口系统的坐标中表示一个光标点,它会自动地为您绘制到右边的屏幕上。我现在无法访问Xcode,所以我无法亲自检查。
https://stackoverflow.com/questions/67591092
复制相似问题