我正在开发支持游戏控制器的OS X应用程序。它必须支持源自IOKit HID和GameController.framework的控制器。 问题我面临的是大多数MFi GameController.framework兼容控制器也是隐藏设备。因此,MFi控制器在控制器列表中出现两次,包括GCController和IOHIDDevice。有没有办法在它们之间建立连接,忽略HID设备?
GCController对象具有私有属性deviceRef
,它指向底层隐藏设备,从而可以识别和忽略HID层中的设备。问题是deviceRef
是私有财产,因此我无法在App Store应用中使用它。
理想的解决方案是识别IOHIDDeviceRef是MFi设备的一种方法,所以我可以在我的HID层中完全跳过它。
答案 0 :(得分:4)
我正在试验GCController,最后找到了一个hacky解决方案。这可能是区分使用GameController框架的控制器和使用IOKit的控制器的唯一方法:
每当新控制器连接到Mac时,分别使用IOHIDDeviceRef和GCController实例为IOKit和GameController调用连接回调。
获取IOHIDDeviceRef的供应商ID和产品ID:
CFNumberRef vendor = static_cast<CFNumberRef>(IOHIDDeviceGetProperty(device, CFSTR(kIOHIDVendorIDKey));
if (vendor) CFNumberGetValue(vendor, kCFNumberSInt32Type, &vendorId);
CFNumberRef product = static_cast<CFNumberRef>(IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductIDKey)));
if (product) CFNumberGetValue(product, kCFNumberSInt32Type, &productId);
typedef struct CF_BRIDGED_TYPE(id) __IOHIDServiceClient * IOHIDServiceClientRef;
extern "C" CFTypeRef _Nullable IOHIDServiceClientCopyProperty(IOHIDServiceClientRef service, CFStringRef key);
if (class_respondsToSelector(object_getClass(controller), sel_getUid("hidServices")))
{
NSArray* hidServices = reinterpret_cast<NSArray* (*)(id, SEL)>(objc_msgSend)(controller, sel_getUid("hidServices"));
if (hidServices && [hidServices count] > 0)
{
IOHIDServiceClientRef service = reinterpret_cast<IOHIDServiceClientRef (*)(id, SEL)>(objc_msgSend)([hidServices firstObject], sel_getUid("service"));
CFNumberRef vendor = static_cast<CFNumberRef>(IOHIDServiceClientCopyProperty(service, CFSTR(kIOHIDVendorIDKey)));
if (vendor)
{
CFNumberGetValue(vendor, kCFNumberSInt32Type, &vendorId);
CFRelease(vendor);
}
CFNumberRef product = static_cast<CFNumberRef>(IOHIDServiceClientCopyProperty(service, CFSTR(kIOHIDProductIDKey)));
if (product)
{
CFNumberGetValue(product, kCFNumberSInt32Type, &productId);
CFRelease(product);
}
}
}
您可以在Ouzel engine。
中查看上述完整代码答案 1 :(得分:2)
GCController具有SQL_USER="abc_user"
的{{1}} API。为了支持早期的系统,我建议猫王建议什么。您还可以参考处理这两种情况的WebKit的source code。