2012-04-22 3 views

答えて

0

これは、上下のボリュームキーの物理的な押下をシミュレートし、OSに詳細を処理させることで実装します。ユーザーが視覚的なフィードバックを無効にしている可能性があります。おそらく変化します。これが最も安全な方法です。

はこれを見ている:Simulating key press events in Mac OS X

+0

私は考えていましたが、私はもっと明確にすべきでしたが、私がやっているのは、キープレスよりも小さなインクリメントで音量を上げたり下げたりすることです。私はキーイベントを投稿すると、意図した分数増分ではなく、標準的な増分で音量が上がります。 – Lazloman

+0

その場合は正直なところ、デフォルトのOS Xボリューム通知を使ってはいけません。これは、レベルが1ブロックのアトミックな増分/減分として示されているからです。ユーザーが実際に作成しているときに、あなたが言うように、はるかに細かい変更。 –

+0

私はLionの前にあった動作を再作成しようとしています。これはもうできないと言っていますか? – Lazloman

6

ここでこのトリックを行いジョージ・ワーナーとケーシーFleserから少しコードです。これが実際にあなたが物事をしたいやり方であることを注意深く考えてみてください。

// Save as sound_up.m 
// Compile: gcc -o sound_up sound_up.m -framework IOKit -framework Cocoa 

#import <Cocoa/Cocoa.h> 
#import <IOKit/hidsystem/IOHIDLib.h> 
#import <IOKit/hidsystem/ev_keymap.h> 


static io_connect_t get_event_driver(void) 
{ 
    static mach_port_t sEventDrvrRef = 0; 
    mach_port_t masterPort, service, iter; 
    kern_return_t kr; 

    if (!sEventDrvrRef) 
    { 
     // Get master device port 
     kr = IOMasterPort(bootstrap_port, &masterPort); 
     check(KERN_SUCCESS == kr); 

     kr = IOServiceGetMatchingServices(masterPort, IOServiceMatching(kIOHIDSystemClass), &iter); 
     check(KERN_SUCCESS == kr); 

     service = IOIteratorNext(iter); 
     check(service); 

     kr = IOServiceOpen(service, mach_task_self(), 
          kIOHIDParamConnectType, &sEventDrvrRef); 
     check(KERN_SUCCESS == kr); 

     IOObjectRelease(service); 
     IOObjectRelease(iter); 
    } 
    return sEventDrvrRef; 
} 


static void HIDPostAuxKey(const UInt8 auxKeyCode) 
{ 
    NXEventData event; 
    kern_return_t kr; 
    IOGPoint  loc = { 0, 0 }; 

    // Key press event 
    UInt32  evtInfo = auxKeyCode << 16 | NX_KEYDOWN << 8; 
    bzero(&event, sizeof(NXEventData)); 
    event.compound.subType = NX_SUBTYPE_AUX_CONTROL_BUTTONS; 
    event.compound.misc.L[0] = evtInfo; 
    kr = IOHIDPostEvent(get_event_driver(), NX_SYSDEFINED, loc, &event, kNXEventDataVersion, 0, FALSE); 
    check(KERN_SUCCESS == kr); 

    // Key release event 
    evtInfo = auxKeyCode << 16 | NX_KEYUP << 8; 
    bzero(&event, sizeof(NXEventData)); 
    event.compound.subType = NX_SUBTYPE_AUX_CONTROL_BUTTONS; 
    event.compound.misc.L[0] = evtInfo; 
    kr = IOHIDPostEvent(get_event_driver(), NX_SYSDEFINED, loc, &event, kNXEventDataVersion, 0, FALSE); 
    check(KERN_SUCCESS == kr); 

} 

int main(int argc, char *argv[]) { 
    HIDPostAuxKey(NX_KEYTYPE_SOUND_UP); 
} 

その他の興味深いキーコードが含まれます:NX_KEYTYPE_SOUND_DOWNNX_KEYTYPE_MUTENX_KEYTYPE_PLAY

+0

ああ、IOKitのものが必要な場合があります。私はこれを見て、それがどのように機能するか見るつもりです。 – Lazloman

+0

これは実際にボリュームを完全に増減させます。つまり、一度に1つの "ブロック"になります。私がやりたいことは、オプションキーと上/下ボタンを押して音量が小数点以下になるように、つまりブロックの四分の一に増やすことができたときに、プレライオンの存在を再現することです。私は分量でコードの音量を増減することができますが、OSに音量の分数増減を同じ分数、つまり一度に4分の1ブロック分だけ報告するようにしたいと考えています。私はIOKitを見て、私がこれをすることができるかどうかを見ていきます、ありがとう、これは私にいくつかのアイデアを与えます。 – Lazloman

関連する問題