MASShortcutをSwiftから使う

グローバルホットキーはDDHotKeyを使ってきましたが、

ショートカットキーラウンチャー その3(DDHotKey) | MacFeeling Blog

今回はMASShortcutを使ってみることに

GitHub – shpakovski/MASShortcut: Modern framework for managing global keyboard shortcuts compatible with Mac App Store. More details:

環境
macOS Monterey 12.6
Xcode 13.4.1
インターフェース: Storyboard
使用言語:Swift

最初Swift Package Managerで導入しようとしたら、私の環境ではエラーが出てしまったので、ソースコードをビルドして、MASShortcut.frameworkをプロジェクトに追加しました。

Xcodeのプロジェクトに追加したら、File » New » FileでHeader Fileを選択、名前は「Bridging-Header.h」にしてください。

追加した、「Bridging-Header.h」に、以下の#import文2行を追加してください。

#ifndef Bridging_Header_h
#define Bridging_Header_h

#import <Cocoa/Cocoa.h>
#import <MASShortcut/Shortcut.h>

#endif /* Bridging_Header_h */

グローバルホットキーの設定部分を作成
ウインドウにCustom Viewを設置して、ClassにMASShortcutViewを設定

swiftファイル(例ではViewControler.swift)に、import MASShortcutと
@IBOutlet weak var shortcutKeyView: MASShortcutView!を追加
@IBOutlet を設置したCustomViewに繋げます

とりあえず、以下のコードを記入すれば、設定したグローバルキーを自動保存して、次回起動時に読み込んで登録してくれるようです。
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        
        // Pick a preference key to store the shortcut between launches
        let kPreferenceGlobalShortcut = "GlobalShortcut"
        
        // Associate the shortcut view with user defaults
        self.shortcutKeyView.associatedUserDefaultsKey = kPreferenceGlobalShortcut
        
        MASShortcutBinder.shared().bindShortcut(withDefaultsKey: kPreferenceGlobalShortcut, toAction: {
            print("設定したグローバルキーが押された")
        })
        
    }

複数のMASShortcutViewを設置するには、kPreferenceGlobalShortcutの値を変えればいいみたいです。
例えば1つ目が”GlobalShortcut”で、2つ目が”GlobalShortcut2″のような感じ

@IBOutlet weak var shortcutKeyView: MASShortcutView!
@IBOutlet weak var shortcutKey2View: MASShortcutView!

//1つ目
let kPreferenceGlobalShortcut = "GlobalShortcut"
self.shortcutKeyView.associatedUserDefaultsKey = kPreferenceGlobalShortcut
MASShortcutBinder.shared().bindShortcut(withDefaultsKey: kPreferenceGlobalShortcut, toAction: {
      print("設定したグローバルキーが押された")
 })
    
//2つ目    
let kPreferenceGlobal2Shortcut = "GlobalShortcut2"
self.shortcutKey2View.associatedUserDefaultsKey = kPreferenceGlobal2Shortcut
MASShortcutBinder.shared().bindShortcut(withDefaultsKey: kPreferenceGlobal2Shortcut, toAction: {
      print("設定したグローバルキー2が押された")
})

通常は、グローバルキーの設定は、設定画面で行うと思うので、その場合は設定画面の方では以下のようにして

import Cocoa
import MASShortcut

class PreferenceViewController: NSViewController {
    
    @IBOutlet weak var shortcutKeyView: MASShortcutView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        let kPreferenceGlobalShortcut = "GlobalShortcut"
        self.shortcutKeyView.associatedUserDefaultsKey = kPreferenceGlobalShortcut

    }

例えば、AppDelegate.swiftの方に、以下のようにするといいかもしれません。

import Cocoa
import MASShortcut

@main
class AppDelegate: NSObject, NSApplicationDelegate {

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        // Insert code here to initialize your application
        let kPreferenceGlobalShortcut = "GlobalShortcut"
        MASShortcutBinder.shared().bindShortcut(withDefaultsKey: kPreferenceGlobalShortcut, toAction: {
            print("設定したグローバルキーが押された")
        })
    }

番外編

使用するグローバルホットキーが固定されていて、手動で登録を行う場合は
例えば、「コマンド+シフト+K」なら

//グローバルホットキーを設定する
 let shortcut = MASShortcut(keyCode: kVK_ANSI_K, modifierFlags: [.command, .shift])

//グローバルホットキーを登録、キーが押されると
 MASShortcutMonitor.shared()?.register(shortcut, withAction: {
            print("キーが押されました。")
 })
 
//アプリを終了する際に登録を解除する 
MASShortcutMonitor.shared()?.unregisterShortcut(shortcut)
        

コメント

タイトルとURLをコピーしました