Mission Control が実行されると、アプリケーションがキーボード イベントとマウス イベントを受信できなくなります。また、最後のアプリケーションがまだフォーカスを持っていると考えて、実行中のアプリケーションを残します。マウス ボタンまたはキーを押したまま Mission Control を起動すると、keyUp または mouseUp イベントを受信せず、アプリケーションがそのマウス ボタンまたはキーを押した場合のように動作するため、これは私にとって問題です。
ミッション コントロールがアクティブな場合でもキーボード イベントとマウス イベントの両方を読み取る方法、またはミッション コントロールがアクティブであることを検出する方法が必要です。理想的には、Mission Control の実行中はアプリケーションを実質的に使用できないため、後者を実行できるようにしたいと考えています。
私は運がないことをいくつか試しました:
- addGlobalMonitorForEventsMatchingMask を使用して、キーボード イベントとマウス イベントのグローバル モニターを登録します。これは、別のアプリケーションに切り替えたときにマウス イベントをキャプチャします (キーボード イベントはキャプチャしませんが、ドキュメントには keyDown イベントをグローバル モニタに送信する必要があると記載されています) が、Mission Control はイベントをグローバル モニタに伝播させないようです。
- 確認してください
[[NSRunningApplication currentApplication] {isActive, ownsMenuBar}]
。どうやら、私のアプリケーションはイベントを受信していなくてもアクティブです! - 確認してください
[NSApp keyWindow] != nil
。どうやら、私のウィンドウの 1 つが重要なイベントを受信しているはずです。それらのどれもありません。 - によって返された実行中のアプリケーションの 1 つに Mission Control があるかどうかを確認し
[NSWorkspace runningApplications]
ます。Mission Control は、実行中はこのリストに表示されません。
編集:
私は最終的にこの問題を回避しました (あまり満足のいく方法ではありませんが)。マウスの場合、押されたボタンの状態を で照会できることがわかりました[NSEvent pressedMouseButtons]
。NSLeftMouseDown および NSLeftMouseUp イベントから、マウスの状態がどうあるべきかを追跡し、それを頻繁に比較して[NSEvent pressedMouseButtons]
、それらが一貫していることを確認します。そうでない場合は、何かが私の NSLeftMouseUp イベントをハイジャックしたことがわかり、それに応じて行動します。
キーボードについては、キーボードの状態を照会する方法が見つからなかったため、同様の回避策を実行できませんでした。キーが押されたときにプレゼンテーションオプションを使用してアプリケーションの切り替えを無効にすることになりました。