NSWindow
私は、ユーザーがどこに行っても画面をたどる透過性を持っています(NSWindow
フルスクリーンアプリであっても、すべてのアプリの前にとどまります)。
その中で、ポップアップを表示NSWindow
するイベントがあります。mouseDown
フルスクリーン モードで safari を使用していて、その前にウィンドウがあり、safari をクリックしてウィンドウをもう一度クリックすると、何も起こらず、mouseDown が発生しません。mouseDown
イベントがトリガーされるように、もう一度クリックする必要があります。バックグラウンドアプリをクリックしてウィンドウを再度クリックしたとき
にトリガーするために2回クリックする必要がないように、常にアクティブにする
方法を教えてください。ありがとうございました!NSWindow
mouseDown
4 に答える
これがまさにあなたが望むものかどうかはわかりませんが(ウィンドウ全体の設定ではありません)、ドキュメントから:
デフォルトでは、キー ウィンドウではないウィンドウでのマウス ダウン イベントは、単にウィンドウを前面に移動してキーにします。イベントは
NSView
、マウス クリックが発生したオブジェクトには送信されません。ただし、は return をオーバーライドすることで、最初のNSView
マウスダウン イベントを要求でき ます。acceptsFirstMouse:
YES
このメソッドの引数は、非キー ウィンドウで発生したマウス ダウン イベントです。ビュー オブジェクトはこれを調べて、マウス イベントを受け取り、ファーストレスポンダになる可能性があるかどうかを判断できます。たとえば、ウィンドウで選択されたオブジェクトに影響を与えるコントロールで、このメソッドの既定の動作が必要な場合。
mouseDown:
ただし、ウィンドウがアクティブでない場合でもメッセージを受信する必要があるコントロールなど、場合によっては、この動作をオーバーライドすることが適切です。このクリックスルー動作をサポートするコントロールの例は、ウィンドウのタイトル バー ボタンです。
または、いじってみることができます
- (void)sendEvent:(NSEvent *)theEvent
カスタムの方法でイベントを処理できるかどうかを確認します。
ボーダーレス NSButton インスタンスをウィンドウのビューに追加し、画像をボタンの画像として (さらに美しくするために代替画像として) 設定すると、そのまま使用できます: ボタンのアクション メソッドをアプリに接続するだけです。デリゲート (またはクリック アクションを処理するオブジェクト)。画像 (つまりボタン) をクリックすると、アクティブなウィンドウに関係なく、ボタンのアクション メソッドがトリガーされます。
これは私にとってはうまくいきました。それが役立つことを願っています。これにより、ウィンドウが常にすべてのアプリケーションの一番上に表示されます
[self.window makeKeyAndOrderFront:nil];
[self.window setLevel:NSStatusWindowLevel];
あなたが本当にすべきことは、意図した動作と戦おうとするのではなく、OSと一貫した方法でまさにあなたが望むことを行うNSPanel(フローティングパレット - 特別な種類のNSWindow)を使用することだと思います。
NSPanel のドキュメントは次のとおりです。
そして、ここにいくつかの役立つ情報があります:
http://cocoadev.com/wiki/NSPanel
デフォルトでは、アプリケーションが非アクティブになると NSPanel は消えますが、これをオフにすることができます。
もっと完全にレイアウトできなかったことをお詫びします...時間に追われています。
編集:
おそらく、ウィンドウを希望どおりに動作させることができることに注意してください。
「ただし、NSView は、acceptsFirstMouse: をオーバーライドして YES を返すことにより、最初のマウスダウン イベントを要求できます。」
「アクティベーションクリック」をスキップするには、NSView サブクラスでこれを行う必要があります。