アプリケーションがフォーカスされていない場合でも、キーストロークを転送する必要がある Mac OS X 用のタイピング チューター アプリケーションに取り組んでいます。
おそらくNSDistributedNotificationCenterを介して、システムにキーストロークをアプリに転送させる方法はありますか? 私はばかげて自分自身をグーグルで検索しましたが、答えを見つけることができませんでした...
編集: 以下のサンプル コード。
正しい方向に向けてくれた@NSGodに感謝します-メソッドを使用してグローバルイベントモニターaddGlobalMonitorForEventsMatchingMask:handler:
を追加することになりました。これは美しく機能します。完全を期すために、私の実装は次のようになります。
// register for keys throughout the device...
[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask
handler:^(NSEvent *event){
NSString *chars = [[event characters] lowercaseString];
unichar character = [chars characterAtIndex:0];
NSLog(@"keydown globally! Which key? This key: %c", character);
}];
私にとって、トリッキーな部分はブロックを使用していたので、誰かに役立つ場合に備えて少し説明します。
上記のコードで注意すべき点は、NSEvent に対する1 つのメソッド呼び出しであるということです。ブロックは引数として関数に直接渡されます。インライン デリゲート メソッドのようなものと考えることができます。これが私にとって沈み込むのに時間がかかったという理由だけで、私はそれをここで段階的に処理するつもりです:
[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask
この最初のビットは問題ありません。NSEvent でクラス メソッドを呼び出し、監視するイベント (この場合は NSKeyDownMask) を伝えます。サポートされているイベント タイプのマスクのリストは、こちらにあります。
ここで、ブロックを必要とするハンドラーという難しい部分に取り掛かります。
handler:^(NSEvent *event){
これを正しく行うにはいくつかのコンパイル エラーが発生しましたが、(Apple に感謝します) 非常に建設的なエラー メッセージでした。まず気になるのはカラット^。これは、ブロックの開始を示します。その後、括弧内に、
NSEvent *event
イベントをキャプチャするためにブロック内で使用する変数を宣言します。あなたはそれを呼び出すことができます
NSEvent *someCustomNameForAnEvent
ブロック内でその名前を使用するだけです。あとは、これで終わりです。中括弧と括弧を閉じて、メソッド呼び出しを終了してください。
}];
そして、あなたは完了です!これは本当に「ワンライナー」のようなものです。アプリ内のどこでこの呼び出しを実行しても問題ありません。AppDelegate の applicationDidFinishLaunching メソッドで実行します。次に、ブロック内で、アプリ内から他のメソッドを呼び出すことができます。