ショートカットキーの監視は、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)が呼ばれた段階で、アクセシビリティの設定がされていない場合は、設定を促すダイアログが表示されるようになります。


コメント