16

この質問は、この質問のコードに関するものです: OS X でヘッドホン ボタンの押下を検出する

彼らの答えは正しいとマークされましたが、彼らのコードを機能させることができませんでした (これは、objective-c の知識が不足していることが原因である可能性があります)。彼らの指示に従い、3 つのファイルを修正しました。これは私が試したものです (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

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

...さらに、KeyboardPaneController.m の 1 行を変更します (説明に示されています)。フレームワークに関するドキュメントが不足しているため、回答を見つけるのは非常に困難です (ポスターは 1 年以上オフラインになっているため、おそらく回答は得られないと思います)。コードはライオンでテストされましたが、私はマウンテン ライオンを持っているので、それが問題になる可能性があります。

iTunes はヘッドフォンのボタンを押したときに非常に反応するので (これは微妙な違いです)、これを実装することは間違いなく可能です。iTunes ではなく、ヘッドフォンのボタンで Spotify を操作できるようにしたいと考えています。

4

1 に答える 1