Swift:让鼠标指针离开窗口

时间:2018-05-15 18:37:12

标签: swift macos sprite-kit

我有一个Mac SpriteKit / swift应用程序(游戏),我需要将光标保持在窗口内。或者至少在离开游戏窗口时发出警告。

我已经设置了跟踪区域,并且正在使用鼠标移动游戏手柄。但是当光标移出窗口时,拨片停止工作。

 let options = [ .mouseMoved,
                .activeAlways,
                .mouseEnteredAndExited] as NSTrackingArea.Options
let tracker = NSTrackingArea(rect:frame, options: options, owner:view, userInfo: nil)
view.addTrackingArea(tracker)

鼠标进入和退出的功能似乎无法启动

override func mouseExited(with event: NSEvent) {
   // NSCursor.unhide()
    print("_____________________EXIT")
   //Never fires

  }

  override func mouseEntered(with event: NSEvent) {
 //   NSCursor.hide()
    print("_____________________ENTER")
 // never fires

  }

有什么想法吗?感谢

2 个答案:

答案 0 :(得分:0)

如果要将鼠标保留在窗口中,可以使用function dijkstra(graph, source) @assert size(graph, 1) == size(graph, 2) node_size = size(graph, 1) dist = fill(Inf, node_size) dist[source] = 0.0 T = Set{Int}(1:node_size) # unvisited nodes pred = fill(-1, node_size) while !isempty(T) min_val, min_idx = minimum((dist[v], v) for v in T) if isinf(min_val) break # Break if remaining nodes are disconnected end delete!(T, min_idx) # distance update for nei in 1:node_size if graph[min_idx, nei] > 0 && nei in T possible_dist = dist[min_idx] + graph[min_idx, nei] if possible_dist < dist[nei] dist[nei] = possible_dist pred[nei] = min_idx end end end end return dist, pred end 。它将鼠标光标设置在屏幕上。

下面是一个示例,以使鼠标在视图中居中:

CGWarpMouseCursorPosition

注意:在这种情况下,请使用NSEvent.addLocalMonitorForEvents(matching: .mouseMoved) { (event) -> NSEvent? in let point = NSPoint(x: self.view.frame.width * 0.5, y: self.view.frame.height * 0.5) let pointInWindow = self.view.convert(point, to: nil) if let pointOnScreen = self.view.window?.convertPoint(toScreen: pointInWindow) { let cgPoint = CGPoint(x: pointOnScreen.x, y: pointOnScreen.y) CGWarpMouseCursorPosition(cgPoint) } return event } 而不是NSEvent.addLocalMonitorForEvents来获取.mouseMoved个事件。

答案 1 :(得分:0)

我认为您会更满意采用其他解决方案:隐藏光标并将鼠标移动从光标位置断开。

您可以使用CGDisplayHideCursorCGDisplayShowCursor隐藏和显示指针。

您可以使用CGAssociateMouseAndMouseCursorPosition将鼠标移动从光标位置断开(然后重新连接)。当鼠标与光标断开连接时收到mouseMovedmouseDragged事件时,您可以从事件的deltaXdeltaY字段中读取鼠标的移动。 / p>