2011-01-26 26 views
7

Objective-C/Cocoa(Mac)にグローバルホットキーを登録する方法を教えてください。登録ホットキー

例えば、私が登録したいホットキーがAltキーだろう - Cmdを - D

任意の助けいただければ幸いです!

+3

;) – nacho4d

+4

「alt-D」をグローバルに使用することは、通常は有効な文字(∂)を生成し、他のアプリケーション(Safariのアクセスキーの例です)で既に定義されている可能性があるため、また、一般的なMacユーザーは、ショートカットの修飾キーとして少なくとも「cmd」を持つことが予想されます。 – Asmus

+0

@Asmus:+1、理想的には "ホットキー"もユーザーが設定可能である必要があります。 –

答えて

10

GitHubに必要なCarbon機能用の便利なCocoaラッパーがあります:JFHotkeyManagerです。また、新しい(10.6以降)NSEvent API addGlobalMonitorForEventsMatchingMask:handler:を使用することもできますが、補助デバイスへのアクセスが有効になっている場合にのみキーイベントを取得します。

+1

Wowza ... [hkm bind:@ "alt command d"ターゲット:自己アクション:@selector(show :)]のようなNSStringsも必要です。 。 =) –

4

Carbonフレームワークの関数InstallApplicationEventHandlerRegisterEventHotKeyを使用します。このblog postはかなり良いハウツーを提供しています(これは私がこのようなことを考え出すときに使用したものです)。

7

私はあなたが行くここ

https://github.com/davedelong/DDHotKey

+1

あなたは、あなたがそのコードで使ったAPIについて説明してください。補助デバイスが有効になっていないのに苦労しているときに 'addGlobalMonitor'を使用しようとしているようです。補助デバイスが有効になっていないときは、 'CGEventTap'オプションがありますか? – Noitidart

+1

@Noitidartあなたはそれを理解しましたか?私はしなかったので。私はなぜ誰かがそれを使用する方法を説明することなく、いくつかの仕事を楽しいものにする良いラッパーを書く時間を費やすのだろうかと思っています。 – user3496846

+1

完全にあなたに同意します@ user3496846 - うまくいけば、CGメソッドとobjcメソッドの両方がアクセス可能で制限されています。ホットキーを登録するには、CarbonメソッドRegisterHotKey - https://developer.apple.comを使用する必要があります。 /legacy/library/documentation/Carbon/Reference/CarbonFrameworkReference/index.html#//apple_ref/doc/uid/TP40004336 – Noitidart

4

...これを簡単に多くの一体にするラッパークラスを書いた:

太字は...私たちは、そのためのタグを持っている理由
#import <Carbon/Carbon.h> 

EventHandlerUPP hotKeyFunction; 

pascal OSStatus hotKeyHandler(EventHandlerCallRef nextHandler,EventRef theEvent, void *userData) 
{  
    FooBar *obj = userData; 
    [obj foo];  
    return noErr; 
} 

@implementation FooBar 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     //handler 
     hotKeyFunction = NewEventHandlerUPP(hotKeyHandler); 
     EventTypeSpec eventType; 
     eventType.eventClass = kEventClassKeyboard; 
     eventType.eventKind = kEventHotKeyReleased; 
     InstallApplicationEventHandler(hotKeyFunction,1,&eventType,self,NULL); 
     //hotkey 
     UInt32 keyCode = 80; //F19  
     EventHotKeyRef theRef = NULL; 
     EventHotKeyID keyID; 
     keyID.signature = 'FOO '; //arbitrary string 
     keyID.id = 1; 
     RegisterEventHotKey(keyCode,0,keyID,GetApplicationEventTarget(),0,&theRef); 

    }   
    return self; 
} 

- (void)foo 
{ 

} 

@end 
+0

完璧に作業しました! – atomikpanda