ショートカットキーの監視は、NSEvent.addGlobalMonitorForEventsMatchingMaskを使っていましたが、私の実装方法に問題があるのか、アクティブになっているアプリの状況によっては、うまくいかないことがあったので、DDHotKeyを利用することにしてみました。
DDHotKeyをダウンロードして解凍したら、以下の6つのファイルをプロジェクトにドラッグ&ドロップして登録
DDHotKeyCenter.h
DDHotKeyCenter.m
DDHotKeyUtilities.h
DDHotKeyUtilities.m
DDHotKeyTextField.h
DDHotKeyTextField.m
今回は、Swiftのプロジェクトへの登録なので、以下のようなダイアログが表示されたら、「Create Bridging Header」を選択
プロジェクトに自動的に、「プロジェクト名-Bridging-Header.h」というファイルが作成されます。
このファイルに
#import "DDHotKeyCenter.h"
を追加
さらに、Carbon.frameworkを追加
この段階でエラーが出る場合
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)を登録しておく必要があります。
追記
上記のままだとアクセシビリティの設定がされていなくてもスルーしてしまうので
起動時にアクセシビリティの設定を確認するには
func applicationDidFinishLaunching(aNotification: NSNotification) {
に
//アクセシビリティの設定を確認する let checkOptionPrompt = kAXTrustedCheckOptionPrompt.takeRetainedValue() as NSString let options: CFDictionary = [checkOptionPrompt: true] if AXIsProcessTrustedWithOptions(options) { //アクセシビリティが設定されている print("アクセシビリティが設定されている") } else { //アクセシビリティが設定されていない print("アクセシビリティが設定されていない") }
AXIsProcessTrustedWithOptions(options)が呼ばれた段階で、アクセシビリティの設定がされていない場合は、設定を促すダイアログが表示されるようになります。
コメント