如何检测OSX 10.5及更高版本上的游戏手柄按键?

Ste*_*ion 11 cocoa

如何在OSX 10.5及更高版本上检测USB游戏手柄上的按键?

我无法绕过那个荒谬复杂的HID管理器(尽管显然它已经用10.5简化了),Apple的代码示例有数千行代码需要几天的时间来理解和隔离我需要的内容,所以我如果有人为这个孤立的问题发布一个简单,完全编码的解决方案,我将不胜感激.


编辑:到目前为止,所有答案都是链接到各种HID设备的源代码或半模糊库,这将需要比我想投入更多的研究时间.我正在开始获得一个实际的代码片段来解决这个简单的问题(使用外部库或不使用).


EDIT POS BOUNTY:感谢大家的帮助; 但不幸的是,系统自动选择的答案对我不起作用,无法弄清楚原因; 并且作者尚未回复我的评论.任何见解都会受到赞赏,但在找到修复程序之前,任何寻找有关此主题的资源的人都应该用一点点盐来回答这个问题.

小智 11

首先,导入IOKit Framework并将其包含在头文件和实现文件中:

#import <IOKit/hid/IOHIDLib.h>
Run Code Online (Sandbox Code Playgroud)

在头文件中,您可能希望拥有此变量:

IOHIDManagerRef hidManager;
Run Code Online (Sandbox Code Playgroud)

然后将其添加到您的实现中:

void gamepadWasAdded(void* inContext, IOReturn inResult, void* inSender, IOHIDDeviceRef device) {
  NSLog(@"Gamepad was plugged in");
}

void gamepadWasRemoved(void* inContext, IOReturn inResult, void* inSender, IOHIDDeviceRef device) {
  NSLog(@"Gamepad was unplugged");
}

void gamepadAction(void* inContext, IOReturn inResult, void* inSender, IOHIDValueRef value) {
  NSLog(@"Gamepad talked!");
  IOHIDElementRef element = IOHIDValueGetElement(value);
  NSLog(@"Element: %@", element);
  int elementValue = IOHIDValueGetIntegerValue(value);
  NSLog(@"Element value: %i", elementValue);
}

-(void) setupGamepad {
  hidManager = IOHIDManagerCreate( kCFAllocatorDefault, kIOHIDOptionsTypeNone);
  NSMutableDictionary* criterion = [[NSMutableDictionary alloc] init];
  [criterion setObject: [NSNumber numberWithInt: kHIDPage_GenericDesktop] forKey: (NSString*)CFSTR(kIOHIDDeviceUsagePageKey)];
  [criterion setObject: [NSNumber numberWithInt: kHIDUsage_GD_GamePad] forKey: (NSString*)CFSTR(kIOHIDDeviceUsageKey)];
  IOHIDManagerSetDeviceMatching(hidManager, criterion);
  IOHIDManagerRegisterDeviceMatchingCallback(hidManager, gamepadWasAdded, (void*)self);
  IOHIDManagerRegisterDeviceRemovalCallback(hidManager, gamepadWasRemoved, (void*)self);
  IOHIDManagerScheduleWithRunLoop(hidManager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
  IOReturn tIOReturn = IOHIDManagerOpen(hidManager, kIOHIDOptionsTypeNone);
  IOHIDManagerRegisterInputValueCallback(hidManager, gamepadAction, (void*)self);
}
Run Code Online (Sandbox Code Playgroud)

并从awakeFromNib调用setupGamepad.您可以修改变量"kHIDUsage_GD_GamePad"以注册其他设备.我通过逐步阅读http://developer.apple.com/library/mac/documentation/DeviceDrivers/Conceptual/HID/hid.pdf文档示例并将其与http中的"真实"源代码进行比较来编写上述内容.://abstractable.net/enjoy

祝好运.


Rob*_*ger 8

Peter对DDHidLib框架的建议正是您所期待的.该库设计得很好,库中附带的示例代码非常明显.

获取连接到系统的所有操纵杆/游戏手柄并使用DDHidLib监视按钮按下的对象的实现看起来像这样:

#import <Cocoa/Cocoa.h>
#import <DDHidLib/DDHidLib.h>

@interface JoyStickWatcher : NSObject
{
    NSArray* joySticks;
}
- (void)startWatchingJoysticks;
@end


@implementation JoyStickWatcher
- (void)startWatchingJoysticks
{
    //get an array of all joystick objects
    joySticks = [[DDHidJoystick allJoysticks] retain];

    //become the delegate of all available joystick objects
    [joySticks makeObjectsPerformSelector:@selector(setDelegate:) withObject:self];
}

- (void)dealloc
{
    [joySticks release];
    [super dealloc];
}

//these are the DDHidLib joystick delegate methods related to buttons

- (void)ddhidJoystick:(DDHidJoystick *)joystick buttonDown:(unsigned)buttonNumber
{
    NSLog(@"button number %ld of joystick %p went down",joystick,buttonNumber);
}

- (void)ddhidJoystick:(DDHidJoystick *)joystick buttonUp:(unsigned)buttonNumber
{
    NSLog(@"button number %ld of joystick %p went up",joystick,buttonNumber);
}

@end
Run Code Online (Sandbox Code Playgroud)