在OS X上使用多个鼠标

18

我正在开发一个OS X应用程序,旨在从两个鼠标接收输入。我想独立读取每个鼠标的运动。最好的方法是什么?

如果不可能,有没有办法以编程方式禁用/启用其中任何一个鼠标?


3
可以实现:Ambrosia Software的游戏《pop-pop》在其多人模式下使用了两个鼠标。我不知道具体是怎样实现的,但我几乎可以确定是通过HID Manager实现的。 - hbw
6个回答

14

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内容变得有点啰嗦。


7

3

您需要查看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中提供的示例。

1

除非你能强制其中一个鼠标不被视为鼠标,否则两个鼠标都将继续控制指针。但是,您可以使用IOKit编写自定义USB HID驱动程序,以允许您的应用程序从一个或两个鼠标读取(尽管这可能会干扰将它们用作普通鼠标)。构建自定义USB设备用户客户机驱动程序 将是一个良好的起点,了解如何直接与USB鼠标交互。


可以隐藏实际光标并单独绘制每个鼠标位置。 - Lyndsey Ferguson
你可以同时隐藏光标并将鼠标与光标分离:http://developer.apple.com/documentation/GraphicsImaging/Conceptual/QuartzDisplayServicesConceptual/Articles/MouseCursor.html - Bids

0
你可以查看USB/PS-2设备中断。即使您不想重写所谓的驱动程序,它也可能很有用,因为所有鼠标都通过此发送其数据。
您还可以查看此页面,其中提供了一些提示 http://multicursor-wm.sourceforge.net/

Mac电脑今天没有PS2接口,过去也从未有过。旧的连接方式称为ADB(Apple Desktop Bus),在连接器方面看起来更像S视频而不是PS2。 - Kris
我认为停留在这里不会有所帮助。 这个想法是要更低层次地查看,以便对设备拥有更多的控制... - Boris Guéry

0
也许对你来说,使用 usb->rsr232 转换器并自己读取串口是一个解决方案?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接