イベント タップからイベントを投稿する際に厄介な問題が発生しています。kCGHIDEventTap で NSSystemDefined をタップし、イベントを新しいイベントに置き換えます。私が直面している問題は、イベントの投稿方法によっては、一部のアプリケーションでしか見られないことです。私のテスト アプリケーションは、Opera、Firefox、Quicksilver、および Xcode です。イベント タップ コールバック内で試したさまざまな手法と結果を以下に示します。各アプリからのアクション (「正しい応答」) を期待しています。「システム ビープ」とは、そのキーに何もバインドされていないシステム サウンドを意味します。
新しいイベントを作成し、コールバックから返します。Opera: 無応答/システム ビープ音、Firefox: 無応答/システム ビープ音、Quicksilver: 正しい応答、Xcode: 無応答/システム ビープ音
新しいイベントを作成し、CGEventPost で kCGSessionEventTap にポストし、null を返します。Opera: 無応答/システム ビープ音、Firefox: 無応答/システム ビープ音、Quicksilver: 正しい応答、Xcode: 無応答/システム ビープ音
新しいイベントを作成し、CGEventPost で kCGAnnotatedSessionEventTap に投稿し、null を返します。Opera: 正しい応答、Firefox: 正しい応答、Quicksilver: 無応答/システム ビープ音、Xcode: 無応答/システム ビープ音
新しいイベントを作成し、CGEventTapPostEvent で投稿し、null を返します。Opera: 無応答/システム ビープ音、Firefox: 無応答/システム ビープ音、Quicksilver: 正しい応答、Xcode: 無応答/システム ビープ音
新しいイベントを作成し、CGEventPost で kCGSessionEventTap に投稿し、新しいイベントを返します。Opera: 無応答/システム ビープ音、Firefox: 無応答/システム ビープ音、Quicksilver: 正しい応答、Xcode: 無応答/システム ビープ音
新しいイベントを作成し、CGEventPost で kCGAnnotatedSessionEventTap に投稿し、新しいイベントを返します。Opera: 正しい応答とシステム ビープ音、Firefox: 正しい応答とシステム ビープ音、Quicksilver: 正しい応答とシステム ビープ音、Xcode: 応答なし/2 回のシステム ビープ音
新しいイベントを作成し、CGEventTapPostEvent で投稿し、新しいイベントを返します。Opera: 無応答/システム ビープ音、Firefox: 無応答/システム ビープ音、Quicksilver: 正しい応答、Xcode: 無応答/システム ビープ音
(6) が最適ですが、ユーザーは、正しい応答に対する余分なシステム ビープ音について不満を漏らしています。これは、イベントの二重投稿が原因であると推測しています。他の組み合わせを試してみるか、他にどこを見ればよいかわかりません。誰でもガイダンスを提供できますか?コールバックからイベントを返すことと、注釈付きタップに投稿することの両方を行わずに結果を取得する方法はありますか?
長い質問で申し訳ありません。私はたくさんの実験をしてきました。
前もって感謝します
更新: これは、イベント タップを作成するために使用するコードです。
CFMachPortRef eventTap;
eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, 0,CGEventMaskBit(NX_SYSDEFINED) | (1 << kCGEventKeyDown) | (1 << kCGEventKeyUp), myCGEventCallback, (void *)hidEventQueue);