Necesito reducir la velocidad del cursor para un movimiento preciso del mouse si el usuario mantiene presionada una tecla específica. ¿Existe una API para hacer esto? Intenté obtener la ubicación del mouse y establecer su posición en la mitad de eso, pero no funciona.

let mouseLoc = NSEvent.mouseLocation

// get the delta
let deltaX = mouseLoc.x - lastX
let deltaY = mouseLoc.y - lastY

lastX = mouseLoc.x; lastY = mouseLoc.y

// add to the current position by half of the real mouse position
var x = currentMousePos.x + (deltaX / 2)
var y = currentMousePos.y + (deltaY / 2)

// invert the y and set the mouse pos
CGDisplayMoveCursorToPoint(CGMainDisplayID(), carbonPoint(from: currentMousePos))
currentMousePos = NSPoint(x: x, y: y)

¿Cómo se cambia la velocidad del cursor?

Revisé Velocidad del mouse / trackpad de Mac mediante programación, pero la función está obsoleta.

2
fuzzyCap 13 nov. 2017 a las 01:31

2 respuestas

La mejor respuesta

Es posible que deba desvincular la posición del cursor con el mouse, manejar los eventos y mover el cursor usted mismo a un ritmo más lento.

https://developer.apple.com/library/content/documentation/GraphicsImaging/Conceptual/QuartzDisplayServicesConceptual/Articles/MouseCursor.html

CGDisplayHideCursor (kCGNullDirectDisplay);
CGAssociateMouseAndMouseCursorPosition (false);
// ... handle events, move cursor by some scalar of the mouse movement
// ... using CGDisplayMoveCursorToPoint (kCGDirectMainDisplay, ...);
CGAssociateMouseAndMouseCursorPosition (true);
CGDisplayShowCursor (kCGNullDirectDisplay);
3
seth 16 dic. 2017 a las 18:58

Gracias a seths respuesta aquí está el código de trabajo básico:

var shiftPressed = false {
    didSet {
        if oldValue != shiftPressed {
            // disassociate the mouse position if the user is holding shift and associate it if not
            CGAssociateMouseAndMouseCursorPosition(boolean_t(truncating: !shiftPressed as NSNumber));
        }
    }
}

// listen for when the mouse moves
localMouseMonitor = NSEvent.addLocalMonitorForEvents(matching: [.mouseMoved]) { (event: NSEvent) in
    self.updateMouse(eventDeltaX: event.deltaX, eventDeltaY: event.deltaY)
    return event
}

func updateMouse(eventDeltaX: CGFloat, eventDeltaY: CGFloat) {
    let mouseLoc = NSEvent.mouseLocation
    var x = mouseLoc.x, y = mouseLoc.y

    // slow the mouse speed when shift is pressed
    if shiftPressed {
        let speed: CGFloat = 0.1
        // set the x and y based off a percentage of the mouse delta
        x = lastX + (eventDeltaX * speed)
        y = lastY - (eventDeltaY * speed)

        // move the mouse to the new position
        CGDisplayMoveCursorToPoint(CGMainDisplayID(), carbonPoint(from: NSPoint(x: x, y: y)));
    }

    lastX = x
    lastY = y
}
1
fuzzyCap 17 dic. 2017 a las 17:15