我試圖阻止滑鼠游標離開螢屏的特定區域。我找不到執行此操作的本機方法,因此我嘗試手動執行此操作。
到目前為止,我有這個:
NSEvent.addGlobalMonitorForEvents(matching: [.mouseMoved, .leftMouseDragged], handler: {(event: NSEvent) in
let x = event.locationInWindow.flipped.x;
let y = event.locationInWindow.flipped.y;
if (x <= 100) {
CGWarpMouseCursorPosition(CGPoint(x: 100, y: y))
}
})
// elsewhere to flip y coordinates
extension NSPoint {
var flipped: NSPoint {
let screenFrame = (NSScreen.main?.frame)!
let screenY = screenFrame.size.height - self.y
return NSPoint(x: self.x, y: screenY)
}
}
這會阻止游標離開 X 軸。偉大的。但它也會阻止游標在 X=100 處沿 y 軸滑動。
所以我嘗試添加增量:
NSEvent.addGlobalMonitorForEvents(matching: [.mouseMoved, .leftMouseDragged], handler: {(event: NSEvent) in
let x = event.locationInWindow.flipped.x;
let y = event.locationInWindow.flipped.y;
let deltaY = event.deltaY;
if (x <= 100) {
CGWarpMouseCursorPosition(CGPoint(x: 100, y: y deltaY))
}
})
現在它確實沿 Y 軸滑動。但是加速太遠了,太快了。我沒有得到的是,如果我嘗試y - deltaY像我期望的那樣滑動,但相反:
NSEvent.addGlobalMonitorForEvents(matching: [.mouseMoved, .leftMouseDragged], handler: {(event: NSEvent) in
let x = event.locationInWindow.flipped.x;
let y = event.locationInWindow.flipped.y;
let deltaY = event.deltaY;
if (x <= 100) {
CGWarpMouseCursorPosition(CGPoint(x: 100, y: y - deltaY))
}
})
現在游標在 X=100 處以適當的加速度沿 Y 軸滑動(就像在螢屏邊緣滑動游標一樣),但它是相反的。向上移動滑鼠,向下移動游標。
如何在自定義區域的邊緣以正確的方向正確平滑地滑動游標?
還是有更好的方法來實作我想要做的事情?
uj5u.com熱心網友回復:
我想到了。我需要減去以前的增量。
所以現在我有了這個:
var oldDeltaX: CGFloat = 0;
var oldDeltaY: CGFloat = 0;
NSEvent.addGlobalMonitorForEvents(matching: [.mouseMoved, .leftMouseDragged, .rightMouseDragged], handler: {(event: NSEvent) in
let deltaX = event.deltaX - oldDeltaX;
let deltaY = event.deltaY - oldDeltaY;
let x = event.locationInWindow.flipped.x;
let y = event.locationInWindow.flipped.y;
let window = (NSScreen.main?.frame.size)!;
let width = CGFloat(1920);
let height = CGFloat(1080);
let widthCut = (window.width - width) / 2;
let heightCut = (window.height - height) / 2;
let xPoint = clamp(x deltaX, minValue: widthCut, maxValue: window.width - widthCut);
let yPoint = clamp(y deltaY, minValue: heightCut, maxValue: window.height - heightCut);
oldDeltaX = xPoint - x;
oldDeltaY = yPoint - y;
CGWarpMouseCursorPosition(CGPoint(x: xPoint, y: yPoint));
});
public func clamp<T>(_ value: T, minValue: T, maxValue: T) -> T where T : Comparable {
return min(max(value, minValue), maxValue)
}
extension NSPoint {
var flipped: NSPoint {
let screenFrame = (NSScreen.main?.frame)!
let screenY = screenFrame.size.height - self.y
return NSPoint(x: self.x, y: screenY)
}
}
這會將滑鼠限制在 1920x1080 的顯示區域內。
我發現 Godot 的源代碼是很好的資源:https ://github.com/godotengine/godot/blob/51a00c2855009ce4cd6475c09209ebd22641f448/platform/osx/display_server_osx.mm#L1087
這是最好或最高效的方法嗎?我不知道,但它有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/431806.html
