Я разрабатываю приложение OS X, которое должно принимать данные от двух мышей. Я хочу прочитать движение каждой мыши независимо. Как лучше всего это сделать?
Если это невозможно, есть ли способ программно отключить/включить любую из мышей?
Я разрабатываю приложение OS X, которое должно принимать данные от двух мышей. Я хочу прочитать движение каждой мыши независимо. Как лучше всего это сделать?
Если это невозможно, есть ли способ программно отключить/включить любую из мышей?
Интерфейс устройства класса HID — это то, что вам нужно. В основном есть два шага:
Сначала вам нужно найти устройства мыши. Для этого вам нужно создать соответствующий словарь, а затем выполнить поиск с его помощью в реестре ввода-вывода. Пример кода здесь, вам нужно будет добавить некоторые дополнительные элементы в словарь, чтобы вы получили только мышей вместо всех HID-устройств в системе. Что-то вроде этого должно помочь:
// Set up a matching dictionary to search the I/O Registry by class
// name for all HID class devices`
hidMatchDictionary = IOServiceMatching(kIOHIDDeviceKey);
// Add key for device usage page - 0x01 for "Generic Desktop"
UInt32 usagePage = 0x01;
CFNumberRef usagePageRef = ::CFNumberCreate( kCFAllocatorDefault, kCFNumberLongType, &usagePage );
::CFDictionarySetValue( hidMatchDictionary, CFSTR( kIOHIDPrimaryUsagePageKey ), usagePageRef );
::CFRelease( usagePageRef );
// Add key for device usage - 0x02 for "Mouse"
UInt32 usage = 0x02;
CFNumberRef usageRef = ::CFNumberCreate( kCFAllocatorDefault, kCFNumberLongType, &usage );
::CFDictionarySetValue( hidMatchDictionary, CFSTR( kIOHIDPrimaryUsageKey ), usageRef );
::CFRelease( usageRef );
Затем вам нужно прослушать очереди X/Y/кнопок с устройств, которые вы нашли выше. Этот пример кода должен указать вам правильное направление. Использование обратных вызовов намного эффективнее, чем опрос!
Код HID выглядит намного сложнее, чем он есть на самом деле - он довольно многословен из-за материала CF.
Вы захотите проверить набор I/O и менеджер HID (Human Interface Device).
Диспетчер HID является частью I/O Kit, так что заглянуть туда может быть полезно. Существует два API для управления HID: старый API немного более болезненный, и тогда у вас есть новый 10.5 и выше API, что немного удобнее.
Важно понимать, что это, вероятно, не будет просто быстрым решением, может потребоваться значительная работа, чтобы заставить его работать. Если вы предполагаете, что у вас установлена версия 10.5 или выше, использование Leopard API определенно поможет.
Также; в зависимости от того, как вы выполняете то, что делаете, для вас может быть важно скрыть курсор мыши, поскольку он все еще может много двигаться, даже если вы получаете информацию от обеих мышей. Если ваше приложение захватывает экран, я бы использовал CoreGraphics, чтобы отключить курсор и просто нарисовать свой собственный.
Вы также можете рассмотреть возможность поиска оболочки для одного из этих API, пример можно найти в этот вопрос.
Если вы не можете заставить одну из мышей не рассматриваться как мышь, обе продолжат управлять указателем. Однако вы можете использовать IOKit для написания пользовательского драйвера USB HID, который позволит вашему приложению считывать данные с одной или обеих мышей (хотя это, вероятно, помешает их использованию в качестве обычных мышей). Создание пользовательских клиентских драйверов для USB-устройств было бы хорошим началом для напрямую взаимодействовать с USB-мышями.
Вы можете посмотреть прерывание устройства USB/PS-2. Даже если вы не хотите переписывать так называемый драйвер, это может быть полезно, поскольку все мыши отправляют свои данные.
Вы также можете проверить эту страницу, которая может дать некоторые подсказки http://multicursor-wm.sourceforge.net/ а>
может быть, это решение для вас использовать конвертер usb->rsr232
и самостоятельно читать последовательный порт?