Несколько мышей в OS X

Я разрабатываю приложение OS X, которое должно принимать данные от двух мышей. Я хочу прочитать движение каждой мыши независимо. Как лучше всего это сделать?

Если это невозможно, есть ли способ программно отключить/включить любую из мышей?


person Johan Kotlinski    schedule 12.05.2009    source источник
comment
Это определенно возможно: игра pop-pop от Ambrosia Software использовала две мыши для многопользовательского режима. Я точно не знаю, как они это сделали, но почти уверен, что через HID Manager.   -  person hbw    schedule 16.05.2009


Ответы (6)


Интерфейс устройства класса 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.

person Bids    schedule 18.05.2009

Похоже, вам нужен HID Manager. находясь в поиске.

person Community    schedule 15.05.2009

Вы захотите проверить набор I/O и менеджер HID (Human Interface Device).

Диспетчер HID является частью I/O Kit, так что заглянуть туда может быть полезно. Существует два API для управления HID: старый API немного более болезненный, и тогда у вас есть новый 10.5 и выше API, что немного удобнее.

Важно понимать, что это, вероятно, не будет просто быстрым решением, может потребоваться значительная работа, чтобы заставить его работать. Если вы предполагаете, что у вас установлена ​​версия 10.5 или выше, использование Leopard API определенно поможет.

Также; в зависимости от того, как вы выполняете то, что делаете, для вас может быть важно скрыть курсор мыши, поскольку он все еще может много двигаться, даже если вы получаете информацию от обеих мышей. Если ваше приложение захватывает экран, я бы использовал CoreGraphics, чтобы отключить курсор и просто нарисовать свой собственный.

Вы также можете рассмотреть возможность поиска оболочки для одного из этих API, пример можно найти в этот вопрос.

person Travis    schedule 16.05.2009

Если вы не можете заставить одну из мышей не рассматриваться как мышь, обе продолжат управлять указателем. Однако вы можете использовать IOKit для написания пользовательского драйвера USB HID, который позволит вашему приложению считывать данные с одной или обеих мышей (хотя это, вероятно, помешает их использованию в качестве обычных мышей). Создание пользовательских клиентских драйверов для USB-устройств было бы хорошим началом для напрямую взаимодействовать с USB-мышями.

person user57368    schedule 15.05.2009
comment
Можно скрыть фактический курсор и нарисовать положение каждой мыши отдельно. - person Lyndsey Ferguson; 15.05.2009
comment
Вы можете как скрыть курсор, так и отсоединить мышь от курсора: developer.apple.com/documentation/GraphicsImaging/Conceptual/ - person Bids; 21.05.2009

Вы можете посмотреть прерывание устройства USB/PS-2. Даже если вы не хотите переписывать так называемый драйвер, это может быть полезно, поскольку все мыши отправляют свои данные.

Вы также можете проверить эту страницу, которая может дать некоторые подсказки http://multicursor-wm.sourceforge.net/

person Boris Guéry    schedule 15.05.2009
comment
У Mac сегодня нет PS2 и никогда не было, старое соединение называется ADB (Apple Desktop Bus), и оно больше похоже на s-video, чем на разъем PS2. - person Kris; 18.05.2009
comment
Я не думаю, что остановка на этом поможет. Идея заключалась в том, чтобы посмотреть на более низкий уровень, чтобы иметь больше контроля над устройствами... - person Boris Guéry; 18.05.2009

может быть, это решение для вас использовать конвертер usb->rsr232 и самостоятельно читать последовательный порт?

person lImbus    schedule 20.05.2009