ale*_*rke 16 cocoa objective-c osx-mountain-lion
此问题与此问题的代码有关:检测OS X中的耳机按钮按下
他们的回答是正确的,但我无法让他们的代码工作(这可能是因为我缺乏对Objective-c的了解).我按照他们的指示,修改了三个文件.这是我尝试过的(我也查看了Apple的IOKit文档,找不到任何耳机硬件按钮文档):
AwesomeClass.h
#import <Cocoa/Cocoa.h>
#include "KeyboardPaneController.h"
@interface AwesomeClass : KeyboardPaneController
+ (NSArray *) allKeyboards;
- (void) initKeyboardElements: (NSArray *) elements;
- (void) ddhidQueueHasEvents: (DDHidQueue *) hidQueue;
@end
Run Code Online (Sandbox Code Playgroud)
AwesomeClass.m
#import "AwesomeClass.h"
#import "DDHidLib.h"
@implementation AwesomeClass
+ (NSArray *) allKeyboards;
{
NSArray *array = [DDHidDevice allDevicesMatchingUsagePage: kHIDPage_Consumer
usageId: kHIDUsage_GD_Pointer
withClass: self
skipZeroLocations: NO];
//Only return "Apple Mikey HID Driver", if not found, return nil.
for (DDHidDevice *device in array) {
if ([[device productName] isEqualToString:@"Apple Mikey HID Driver"]) {
return [NSArray arrayWithObject:device];
}
}
return nil;
}
- (void) initKeyboardElements: (NSArray *) elements;
{
NSEnumerator * e = [elements objectEnumerator];
DDHidElement * element;
while (element = [e nextObject])
{
unsigned usagePage = [[element usage] usagePage];
unsigned usageId = [[element usage] usageId];
if (usagePage == kHIDPage_GenericDesktop)
{
if ((usageId >= 0x89) && (usageId <= 0x8D))
{
[mKeyElements addObject: element];
}
}
NSArray * subElements = [element elements];
if (subElements != nil)
[self initKeyboardElements: subElements];
}
}
- (void) ddhidQueueHasEvents: (DDHidQueue *) hidQueue;
{
DDHidEvent * event;
while ((event = [hidQueue nextEvent]))
{
DDHidElement * element = [self elementForCookie: [event elementCookie]];
unsigned usageId = [[element usage] usageId];
SInt32 value = [event value];
if (value == 1)
[self ddhidKeyboard: self keyDown: usageId];
}
}
@end
Run Code Online (Sandbox Code Playgroud)
...以及在KeyboardPaneController.m中修改一行(在说明中显示).由于缺乏关于框架的文档,很难找到答案(海报已经离线超过一年,所以我假设我可能不会得到回复).代码在狮子身上进行了测试,我有山狮,所以这可能是问题所在.
我知道这肯定是可以实现的,因为iTunes对我的耳机按钮按下非常敏感(这有点细微差别).我希望能够通过耳机上的按钮而不是iTunes来控制Spotify.
测试显示它不再作为键盘实现:
id array = [[DDHidDevice allDevices] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"productName == \"Apple Mikey HID Driver\""]];
DDHidDevice *mic = [array count] ? [array objectAtIndex:0] : nil;
// it isn't a keyboard
NSLog(@"%@", mic.primaryUsage);
assert(mic.usage==1 && mic.usagePage==12);
Run Code Online (Sandbox Code Playgroud)
您不能像HIDKeyboard一样对待它(尝试过它,它不会发送按键),也不能像HIDMouse或HID操纵杆那样对待它.
我挖到HIDQueue类并检查mikey是否会触发任何低级别事件并且它会触发低级别事件!在queueCallbackFunction被调用印刷(如果你不筛选特定的事件队列中.对其进行过滤,请initWithKeyboardEvents在DDHidKeyboard.
现在你要做的就是将低级事件映射到正确的按钮,你就完成了.也许把它全部包装在一个很好的课程中.这是GitHub上的类和相关代码的示例.
| 归档时间: |
|
| 查看次数: |
9005 次 |
| 最近记录: |