nazo6 noteblog

USB HIDキーボードでメディアキーを操作する方法

作成:2024/05/24

更新:2024/05/24

この記事は、Zennにも投稿しています。
USB HIDでは0x80がVolume Up、0x81がVolume Downに割り当てられており、さらに0xED0xEEでもVolume UpやDownができそうですが、実はこれらは全て動きません(Windowsでは)。
Volume UpやDownを送るためには通常のキーボード用レポートディスクリプタではなく、メディアキー専用のレポートディスクリプタを使うデバイスを作成する必要があります。
他の言語では分かりませんが、Rustではusbd_hidを用いることでメディアキー用のレポートを作成することができます。

MediaKeyboardReport in usbd_hid::descriptor - Rust

docs.rs

バリアントとして使用可能なのは以下のキーになります。

MediaKey in usbd_hid::descriptor - Rust

docs.rs

抜粋:
pub enum MediaKey {
Zero = 0x00,
Play = 0xB0,
Pause = 0xB1,
Record = 0xB2,
NextTrack = 0xB5,
PrevTrack = 0xB6,
Stop = 0xB7,
RandomPlay = 0xB9,
Repeat = 0xBC,
PlayPause = 0xCD,
Mute = 0xE2,
VolumeIncrement = 0xE9,
VolumeDecrement = 0xEA,
Reserved = 0xEB,
}
デバイスの作成は例えばembassy_usbでは以下のようになります。
let config = embassy_usb::class::hid::Config {
report_descriptor: MediaKeyboardReport::desc(),
request_handler: None,
poll_ms: 10,
max_packet_size: 64,
};
HidReaderWriter::<_, 1, 8>::new(&mut builder, &mut State::new(), config)
メディアキーでは送信できるのは一つのキーのみで、さらに「押されている状態を送信する」通常のキーとは違い「送信するたびに押されたことにする」ようになっているみたいです。