For future reference for anybody, I ended up using
return FReply::Handled().CaptureMouse(FSlateApplication::Get().GetGameViewport().ToSharedRef())
.CaptureJoystick(FSlateApplication::Get().GetGameViewport().ToSharedRef())
.LockMouseToWidget(FSlateApplication::Get().GetGameViewport().ToSharedRef())
.SetKeyboardFocus(FSlateApplication::Get().GetGameViewport().ToSharedRef(), EKeyboardFocusCause::Mouse);
.UseHighPrecisionMouseMovement(FSlateApplication::Get().GetGameViewport().ToSharedRef());
}
The key line which fixed things was the UseHighPrecisionMouseMovement. Documentation mentions that this ‘implies mouse capture and hidden mouse movement’. Is there any documentation on the implementation of ‘hidden mouse movement’? It sort of feels clunky to use this call, in terms of expressing my intent in code.