3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[macApp] Macでメディアキーの押下をエミュレートする

Last updated at Posted at 2021-10-26

メディアキーとは

ここでメディアキーと呼んでいるのは、キーボードの最上段にある↓このキーのことです。
mediaKey.png

メディアキーをプログラムから入力するコードは以下の通り。

メディアキー入力

func HIDPostMediaKey(_ key: Int32) {
    func doMediaKey(_ key: Int, down: Bool) {
        let modifierFlags = NSEvent.ModifierFlags(rawValue: down ? 0xA00 : 0xB00)
        let nsEvent = NSEvent.otherEvent(with: .systemDefined, location: NSPoint(x: 0, y: 0), modifierFlags: modifierFlags, timestamp: 0, windowNumber: 0, context: nil, subtype: 8, data1: (key << 16) | ((down ? 0xA : 0xB) << 8), data2: -1)
        let cgEvent = nsEvent?.cgEvent
        cgEvent?.post(tap: .cghidEventTap)
    }
    doMediaKey(Int(key), down: true)  //key press
    doMediaKey(Int(key), down: false) //key release
}

使い方は簡単で、引数にキータイプを指定するだけ。例えば、音量アップならNX_KEYTYPE_SOUND_UPを指定する。

音量アップ
  HIDPostMediaKey(NX_KEYTYPE_SOUND_UP)

引数で指定するキータイプは、下記の通り。

キー キータイプ定数
f1.png NX_KEYTYPE_BRIGHTNESS_DOWN
f2.png NX_KEYTYPE_BRIGHTNESS_UP
f7.png NX_KEYTYPE_REWIND
f8.png NX_KEYTYPE_PLAY
f9.png NX_KEYTYPE_FAST
f10.png NX_KEYTYPE_MUTE
f11.png NX_KEYTYPE_SOUND_DOWN
f12.png NX_KEYTYPE_SOUND_UP
eject.png NX_KEYTYPE_EJECT

上のものも含めて、キータイプは下記の通り記述されている。いくつか試したが、機能しているかどうか確認できなかったものが多かった。

IOKit.hidsystem
public var NX_NOSPECIALKEY: Int32 { get }
public var NX_KEYTYPE_SOUND_UP: Int32 { get }
public var NX_KEYTYPE_SOUND_DOWN: Int32 { get }
public var NX_KEYTYPE_BRIGHTNESS_UP: Int32 { get }
public var NX_KEYTYPE_BRIGHTNESS_DOWN: Int32 { get }
public var NX_KEYTYPE_CAPS_LOCK: Int32 { get }
public var NX_KEYTYPE_HELP: Int32 { get }
public var NX_POWER_KEY: Int32 { get }
public var NX_KEYTYPE_MUTE: Int32 { get }
public var NX_UP_ARROW_KEY: Int32 { get }
public var NX_DOWN_ARROW_KEY: Int32 { get }
public var NX_KEYTYPE_NUM_LOCK: Int32 { get }

public var NX_KEYTYPE_CONTRAST_UP: Int32 { get }
public var NX_KEYTYPE_CONTRAST_DOWN: Int32 { get }
public var NX_KEYTYPE_LAUNCH_PANEL: Int32 { get }
public var NX_KEYTYPE_EJECT: Int32 { get }
public var NX_KEYTYPE_VIDMIRROR: Int32 { get }

public var NX_KEYTYPE_PLAY: Int32 { get }
public var NX_KEYTYPE_NEXT: Int32 { get }
public var NX_KEYTYPE_PREVIOUS: Int32 { get }
public var NX_KEYTYPE_FAST: Int32 { get }
public var NX_KEYTYPE_REWIND: Int32 { get }

public var NX_KEYTYPE_ILLUMINATION_UP: Int32 { get }
public var NX_KEYTYPE_ILLUMINATION_DOWN: Int32 { get }
public var NX_KEYTYPE_ILLUMINATION_TOGGLE: Int32 { get }

このファイルの定数をSwiftで宣言しただけと思われる。NeXTが懐かしい)

なお、上記のコードをはじめて実行すると、システム環境設定のプライバシーが開くので、該当appにアクセシビリティの制御許可を与える必要があります。

インテルMacbook Pro / macOS 11.6 / Xcode 13.1 / Swift 5.5.1 で動作確認済み

参考

  • 以下のPythonコードを参考にした。

  • キーボードとマウスのエミュレート方法は↓この記事にあります。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?