我正在开发一个OS X应用程序,它应该从两只老鼠那里获取输入。我想独立阅读每只鼠标的动作。最好的方法是什么?
如果不可能,有没有办法以编程方式禁用/启用任何一个鼠标?
答案 0 :(得分:13)
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 /按钮队列。这个sample code应该指向正确的方向。使用回调比轮询更有效!
HID代码看起来比它复杂得多 - 它被CF的东西变得相当“冗长”。
答案 1 :(得分:7)
看起来HID Manager就是你要找的东西。
答案 2 :(得分:3)
您将要查看I / O Kit和HID(人机接口设备)管理器。
HID经理是I/O Kit的一部分,因此调查可能会有用。有两个用于HID管理的API,older API有点痛苦,然后你有了新的10.5 and above API更舒服。
要理解的重要一点是,这可能不仅仅是一个快速修复,它可能需要一些重要的工作才能使它运行。如果您可以假设您安装了10.5或更高版本,那么使用Leopard API肯定会有所帮助。
也;取决于你如何完成你正在做的事情,对你来说隐藏鼠标光标可能很重要,因为即使你从两只老鼠那里收到信息,它仍然会移动很多。如果您的应用程序抓取了屏幕,我将使用CoreGraphics来禁用光标并自行绘制。
您也可以考虑为其中一个API找到包装器,可以在this question中找到一个示例。
答案 3 :(得分:1)
除非您可以强制其中一只老鼠不作为鼠标处理,否则两者都将继续控制指针。但是,您可以使用IOKit编写自定义USB HID驱动程序,以允许您的应用程序从一个或两个鼠标中读取(尽管这可能会干扰将它们用作普通鼠标)。对于如何直接与USB鼠标进行交互,Building Customized User Client Drivers for USB Devices将是一个很好的起点。
答案 4 :(得分:0)
您可以查看USB / PS-2设备中断。 即使您不想重写所谓的驱动程序,它也很有用,因为所有鼠标都会通过它们发送数据。
您还可以查看此页面,其中可以提供一些提示http://multicursor-wm.sourceforge.net/
答案 5 :(得分:0)
也许这是您使用usb->rsr232
转换器并自行阅读串口的解决方案?