iTunes ミニプレーヤー (一例を挙げると) は、再生/一時停止および音量コントロールが使用されているときにアプリケーションが前面に表示されないクリックスルーをサポートしています。
これはどのように行われますか?
私はAppleのドキュメントを調べてきましたが、Cocoa Event-Handling GuideのEvent Dispatchに次のように記載されています。
一部のイベントは、その多くがアプリケーション キット (タイプ NSAppKitDefined) によって定義されており、ウィンドウまたはアプリケーション オブジェクト自体によって制御されるアクションと関係があります。これらのイベントの例としては、アプリケーションのアクティブ化、非アクティブ化、非表示、および表示に関連するイベントがあります。NSApp は、ディスパッチ ルーチンの早い段階でこれらのイベントを除外し、それ自体を処理します。
したがって、私の限られた理解 ( How an Event Enters a Cocoa, Application ) から、NSApplication をサブクラス化し、オーバーライド
- (void)sendEvent:(NSEvent *)theEvent
すると、すべてのマウスとキーボードのイベントをトラップする必要がありますが、それでもクリックするとウィンドウが表示されます。したがって、イベントが NSApplication によって表示される前にウィンドウが発生するか、何か他のものが不足しています。
Matt Gallagher のDemystifying NSApplication を再作成して調べましたが、残念ながら Matt はイベント キューをカバーしていませんでした。
どんな助けでも感謝します、ありがとう。
編集して追加: Loyd's Loungeで同じ問題について話している投稿を見つけ、CocoaBuilder の投稿にリンクし、最初の右マウス ダウンをキャプチャします。[theEvent type] の NSLog をいじって再アクティブ化した後、マウスの左ボタンのアクティビティがキャッチされています。
ここで、ウィンドウを左クリックして前面に出すと、一連のイベント タイプが生成13, 1, 13
されます。これらは、NSAppKitDefined、NSLeftMouseDown、および NSAppKitDefined です。これらを除外したり、どこに行くのかを見つけたりすることはできますか?