2009-08-12 13 views
6

私のアプリケーションですべてのキーボードイベントをトラップする方法はありますか?私は、ユーザーが私のアプリケーション(アプリケーションは複数のビューを持っている)のキーボードを使って何かを入力しているかどうかを知る必要があります。私はUIWindowをサブクラス化してキーボードイベントをキャプチャすることができないため、touchEventsをキャプチャすることができました。iPhoneのキーボードイベントを受け取ります

答えて

13

使用NSNotificationCenter

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyPressed:) name: UITextFieldTextDidChangeNotification object: nil]; 

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyPressed:) name: UITextViewTextDidChangeNotification object: nil]; 

........ 

-(void) keyPressed: (NSNotification*) notification 
{ 
    NSLog([[notification object]text]); 
} 
2

簡単な答えではありませんが、2つの方法があります。

  1. UIWindowで行ったように入力コンポーネント(UITextView、UITextFieldなど)をサブクラス化します。

  2. アプリケーション全体のUITextViewDelegate(およびUITextFieldDelegate)を作成し、すべての入力フィールド代理人を割り当てます。

+0

これは少し難解であり、多くの作業が必要です。キャプチャするAppレベルのイベントがいくつか見られることを願っていました – iamMobile

10

私はを参照してください私のブログ

でたUIEventの少しハックを使用してイベントをキャッチについて書いた:詳細については Catching Keyboard Events in iOS

上記のブログから

トリックは直接GSEventKey構造体のメモリにアクセスしており、押されたキーのキーコードとフラグを知って 特定のバイトを確認してください。 以下のコードはほとんど説明がなく、 UIApplicationサブクラスに配置する必要があります。

#define GSEVENT_TYPE 2 
#define GSEVENT_FLAGS 12 
#define GSEVENTKEY_KEYCODE 15 
#define GSEVENT_TYPE_KEYUP 11 

NSString *const GSEventKeyUpNotification = @"GSEventKeyUpHackNotification"; 

- (void)sendEvent:(UIEvent *)event 
{ 
    [super sendEvent:event]; 

    if ([event respondsToSelector:@selector(_gsEvent)]) { 

     // Key events come in form of UIInternalEvents. 
     // They contain a GSEvent object which contains 
     // a GSEventRecord among other things 

     int *eventMem; 
     eventMem = (int *)[event performSelector:@selector(_gsEvent)]; 
     if (eventMem) { 

      // So far we got a GSEvent :) 

      int eventType = eventMem[GSEVENT_TYPE]; 
      if (eventType == GSEVENT_TYPE_KEYUP) { 

       // Now we got a GSEventKey! 

       // Read flags from GSEvent 
       int eventFlags = eventMem[GSEVENT_FLAGS]; 
       if (eventFlags) { 

        // This example post notifications only when 
        // pressed key has Shift, Ctrl, Cmd or Alt flags 

        // Read keycode from GSEventKey 
        int tmp = eventMem[GSEVENTKEY_KEYCODE]; 
        UniChar *keycode = (UniChar *)&tmp; 

        // Post notification 
        NSDictionary *inf; 
        inf = [[NSDictionary alloc] initWithObjectsAndKeys: 
         [NSNumber numberWithShort:keycode[0]], 
         @"keycode", 
         [NSNumber numberWithInt:eventFlags], 
         @"eventFlags", 
         nil]; 
        [[NSNotificationCenter defaultCenter] 
         postNotificationName:GSEventKeyUpNotification 
             object:nil 
            userInfo:userInfo]; 
       } 
      } 
     } 
    } 
} 
+1

「[外部リソースへのリンクを正しく作成するにはどうすればよいですか?」](http://meta.stackexchange.com/questions/94022/how-could -i-write-my-answer-that-external-resource-that-external-resource-appropriate)を使用します。 –

+0

私は何を得たのか分かりません。はい、リンクは私のブログの投稿にありますが、この質問には完全に答えています。それはShift、Cmd、Ctrl、Altを含むすべてのキーボードイベントをキャッチします。 Private APIを使用している場合は、** hack **と明示しました。私はここで誰かをだましていません。 – nacho4d

+0

おそらくあなたの答えが質問に答えないので、それは消えたり、壊れたり、単にこの質問を超えて変わる可能性のある外部ソースを指しているだけです。 Learが指摘するように、彼女が指摘したセクションを読んでください。答えは以下の適切な規則に従うことを指しています: - リンクされたアイテムの内容を言い換えれば(詳細や例を省略するかもしれない) - あなたは自分自身を識別します(自分自身、MSDNなど) - 誰かがリンクされたアイテムを一切読まずに答えてください - リンクをクリックする価値があるかどうかを読者に知らせるための情報が含まれています – Coyote

関連する問題