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

この記事は最終更新日から 約9年が経過しているので情報が古い可能性があります。

ショートカットキーの監視は、NSEvent.addGlobalMonitorForEventsMatchingMaskを使っていましたが、私の実装方法に問題があるのか、アクティブになっているアプリの状況によっては、うまくいかないことがあったので、DDHotKeyを利用することにしてみました。

DDHotKeyをダウンロードして解凍したら、以下の6つのファイルをプロジェクトにドラッグ&ドロップして登録

DDHotKeyCenter.h
DDHotKeyCenter.m
DDHotKeyUtilities.h
DDHotKeyUtilities.m
DDHotKeyTextField.h
DDHotKeyTextField.m

今回は、Swiftのプロジェクトへの登録なので、以下のようなダイアログが表示されたら、「Create Bridging Header」を選択
xcode01

プロジェクトに自動的に、「プロジェクト名-Bridging-Header.h」というファイルが作成されます。
このファイルに

#import "DDHotKeyCenter.h"

を追加

さらに、Carbon.frameworkを追加
xcode02

この段階でエラーが出る場合
DDHotKeyUtilities.hの

#import <Foundation/Foundation.h>

#import <Cocoa/Cocoa.h>

に変更することで、私の場合はエラーが出なくなりました。

これで、SwiftのプロジェクトからDDHotKeyを利用する準備が整いました。

ホットキーの登録

let hotkeyCenter: DDHotKeyCenter = DDHotKeyCenter.sharedHotKeyCenter()

//例えばOption + Command + Kを登録する場合は
let flags: NSEventModifierFlags

flags = [.AlternateKeyMask, .CommandKeyMask]
//shift & control & option & command keyを使う場合は
//flags = [.ShiftKeyMask, .ControlKeyMask, .AlternateKeyMask, .CommandKeyMask]

//ショートカットキーの番号を知っている場合は(例えばKは40なので)
 hotkeyCenter.registerHotKeyWithKeyCode(
                UInt16(40),
                modifierFlags: flags.rawValue,
                target: self,
                action: "keyDown:",
                object: nil
            )

//ショートカットキーの番号が分からない場合、K は kVK_ANSI_K なのでこれを利用します。 
//この場合「import Carbon」を追加しておく必要があります。
 hotkeyCenter.registerHotKeyWithKeyCode(
                UInt16(kVK_ANSI_K),
                modifierFlags: flags.rawValue,
                target: self,
                action: "keyDown:",
                object: nil
            )

func keyDown(theEvent:NSEvent) {
     //ここで処理を行う
}

ホットキーの登録解除

let hotkeyCenter: DDHotKeyCenter = DDHotKeyCenter.sharedHotKeyCenter()

//例えば登録した Option + Command + K を登録解除する場合は
let flags: NSEventModifierFlags

flags = [.AlternateKeyMask, .CommandKeyMask]
//ショートカットキーの番号が分かっていれば(例えばKは40なので)それを指定。
hotkeyCenter.unregisterHotKeyWithKeyCode(
     UInt16(40),
     modifierFlags: flags.rawValue)
}

//ショートカットキーの番号が分からない場合(KはkVK_ANSI_K)なので、UInt16(kVK_ANSI_K)を利用します。 
//この場合「import Carbon」を追加しておく必要があります。
hotkeyCenter.unregisterHotKeyWithKeyCode(
    UInt16(kVK_ANSI_K),
    modifierFlags: flags.rawValue)
}

なお、これらの機能を利用するには(以下の画像はEl Capitanのもの)
「システム環境設定」»「セキュリティとプライバシー」»「プライバシー」タブ »「アクセシビリティ」に
デバックするために Xcode と、ビルドしたアプリ(画像ではShocker.app)を登録しておく必要があります。
xcode03

追記
上記のままだとアクセシビリティの設定がされていなくてもスルーしてしまうので
起動時にアクセシビリティの設定を確認するには
func applicationDidFinishLaunching(aNotification: NSNotification) {

//アクセシビリティの設定を確認する
let checkOptionPrompt = kAXTrustedCheckOptionPrompt.takeRetainedValue() as NSString
let options: CFDictionary = [checkOptionPrompt: true]

if AXIsProcessTrustedWithOptions(options) {
    //アクセシビリティが設定されている
    print("アクセシビリティが設定されている")
} else {
    //アクセシビリティが設定されていない
    print("アクセシビリティが設定されていない")
}

AXIsProcessTrustedWithOptions(options)が呼ばれた段階で、アクセシビリティの設定がされていない場合は、設定を促すダイアログが表示されるようになります。

security_privacy02

コメント

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