我正在开发一个OS X应用程序,旨在从两个鼠标接收输入。我想独立读取每个鼠标的运动。最好的方法是什么?
如果不可能,有没有办法以编程方式禁用/启用其中任何一个鼠标?
HID类设备接口就是您需要的。基本上有两个步骤:
首先,您需要查找鼠标设备。为此,您需要构造一个匹配字典,然后使用它在IO注册表中搜索。这里有一些示例代码here,您需要向字典添加一些其他元素,以便只获取系统上的鼠标而不是所有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 Kit和HID(Human Interface Device)管理器相关内容。
HID管理器是I/O Kit的一部分,因此研究该内容可能会有用。 HID管理有两个API,旧API比较麻烦,而10.5及以上版本API则更加方便。
重要的是要理解,这可能不仅仅是一个快速修复,可能需要一些重要的工作才能使其运行。如果您可以假设已安装了10.5或更高版本,则使用Leopard API肯定会有所帮助。
此外,根据您完成任务的方式,隐藏鼠标光标可能很重要,因为即使您从两个鼠标接收信息,光标仍然可能移动很多。如果您的应用程序抓取屏幕,我建议使用CoreGraphics来禁用光标并绘制自己的光标。您还可以考虑找到一个这些API的包装器,例如this question中提供的示例。除非你能强制其中一个鼠标不被视为鼠标,否则两个鼠标都将继续控制指针。但是,您可以使用IOKit编写自定义USB HID驱动程序,以允许您的应用程序从一个或两个鼠标读取(尽管这可能会干扰将它们用作普通鼠标)。构建自定义USB设备用户客户机驱动程序 将是一个良好的起点,了解如何直接与USB鼠标交互。
usb->rsr232
转换器并自己读取串口是一个解决方案?