特定のキーボードのキーストロークを UDP サーバーに送信する単純なコマンド ライン プログラムを作成しようとしています。IOKit
フレームワークとそのIOHIDManager
クラスを使用してOSXでプログラミングしています。
kIOHIDOptionsTypeSeizeDevice
私のプログラムの目的のために、インスタンスを開き、を使用IOHIDManager
してコールバック設定で UDP メッセージを送信するときに を使用したいと思いますIOHIDManagerRegisterInputValueCallback
。
関数を介してフィルタリングをセットアップしIOHIDManagerSetDeviceMatching
て MacBook Pro の内部キーボードに一致させると、すべてが正常に機能します。キーの押下はフォーカスされたアプリケーションに渡されなくなり、イベントは UDP 経由で正しく送信されます。
USB CardReader ( http://www.gitak.com/GIT-200USB.PDF )を照合しようとすると、カードをスワイプするときにデバイスから送信される最初のイベントまで、すべてが正しく機能します。最初の文字の後、登録されたコールバックはもう呼び出されません。
より正確には:
- デバイスが正しく一致している (複数回プラグを抜いた場合でも)
- 最初に受け取った文字は正しく処理されます
- デバイスには、新しいスワイプの準備ができたことを示す LED があります。通常、スワイプ後に緑色に戻りますが、この場合、最初のイベントが送信された後はオフのままです。
- 内部キーボードを使用すると、すべてが期待どおりに機能します
kIOHIDOptionsTypeSeizeDevice
kIOHIDOptionsTypeNone
の代わりにカードリーダーを使用すると、すべてが期待どおりに機能しkIOHIDOptionsTypeSeizeDevice
ます (イベントは引き続きフォーカスされたアプリケーションに渡されます)。- 応答しなくなった後、デバイスのプラグを抜き差しすると、説明されている動作が繰り返されます
- プログラムはルート権限で実行されました
比較的単純なプログラムは次の場所にあります。
https://gist.github.com/3783042
最初のイベントを送信した後にカード リーダーが応答しなくなるのを防ぐには、どうすれば変更できますか?