Как получить точные различия между мышью и трекпадом в macOS при использовании CGWarpMouseCursorPosition?IOS

Программируем под IOS
Ответить
Anonymous
 Как получить точные различия между мышью и трекпадом в macOS при использовании CGWarpMouseCursorPosition?

Сообщение Anonymous »

Я работаю над приложением удаленного управления для macOS, где мне нужно поддерживать два «виртуальных» курсора:
  • Удаленный курсор: следует за движениями удаленного пользователя.
  • Локальный курсор: следует за физическими движениями мыши/трекпада локального пользователя.
Чтобы переместить системный курсор (для удаленной стороны), я использую CGWarpMouseCursorPosition следующим образом:

Код: Выделить всё

void DualCursorMac::UpdateSystemCursorPosition(int x, int y) {
CGPoint point = CGPointMake(static_cast(x), static_cast(y));
// Warp the cursor to match remote coordinates
CGWarpMouseCursorPosition(point);
}
Тем временем я использую CGEventTap для мониторинга локальных физических движений и обновления пользовательского интерфейса моего локального виртуального курсора:

Код: Выделить всё

CGEventRef Mouse::MouseTapCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
if (remoteControlMode) {
// We want to suppress system cursor movement but still read the delta
const int deltaX = static_cast(CGEventGetIntegerValueField(event, kCGMouseEventDeltaX));
const int deltaY = static_cast(CGEventGetIntegerValueField(event, kCGMouseEventDeltaY));

NSLog(@"MouseTapCallback: delta:(%d, %d)", deltaX, deltaY);

// Update local virtual cursor UI based on deltas...
return nullptr; // Consume the event
}
return event;
}
Проблема:
Когда CGWarpMouseCursorPosition часто вызывается для обновления системного курсора, это мешает значениям kCGMouseEventDeltaX/Y в Event Tap.
В частности, если локальный пользователь медленно перемещает трекпад (ожидается дельта 1 или 2), но «Деформация» происходит одновременно (например, переход курсора с (100, 100) на (300, 300)), значения deltaX и deltaY в обратном вызове внезапно достигают очень больших значений. Кажется, система вычисляет дельту на основе нового искривленного положения, а не чистого физического смещения трекпада.
Это заставляет локальный виртуальный курсор «прыгать» беспорядочно и делает невозможным отслеживание плавного локального движения во время удаленного управления.
Мой вопрос:
Есть ли способ получить «необработанное» или «чистое» физическое относительное движение (дельта) с трекпада/мыши, которая независима от абсолютного положения или деформации системного курсора?
Существуют ли альтернативные API (возможно, IOKit или другие поля CGEvent), которые позволили бы мне получать согласованные отклонения, даже если курсор деформируется программно?

Подробнее здесь: https://stackoverflow.com/questions/798 ... usecursorp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»