0

私が開発しているアプリケーションは、メニューバーのクリックを拒否できる必要があります。メニューがクリックされたときに通知を受ける方法はいくつかあります (主にNSMenu通知とNSMenu委任) が、私が見る限り、アクションを拒否できる方法はありません。

私が考えていた解決策は、枠のない透明なウィンドウを使用して、メニュー バーに重ねることです。ウィンドウ レベルを十分に高い値 (NSStatusWindowLevelこの場合) に設定すると、ウィンドウは効果的にメニュー バーの上に配置および描画され、他の方法ではウィンドウに移動するマウス イベントをキャッチします。そうすれば、私は探しているものを持っています。

このソリューションの問題は、ステータス バー (右揃えのグローバル メニュー項目) のイベントもマスクしてしまうことです。この問題を解決するには、ステータス バーのスパンまたはメニュー バーのスパンのいずれかを知ることができる必要がありますが、どちらも明らかな方法が見つかりませんでした。NSApp.mainMenu.sizeポップアップ メニューにレイアウトされているかのようにメイン メニューのサイズを返しますが、これは明らかに必要なものではありません。

イベントをメニューバーにマスクするより良い方法はありますか、またはステータスバーを除いてその幅を見つける方法はありますか?

これはおそらくすべて非常に汚いように聞こえますが、そうです。ユーザーがメニューバーをクリックしたときにアプリケーションがメニューを表示する責任を負っていた古いプラットフォームのアプリケーションレベルのエミュレーターでこれを行っているため、それが発生したときに必要なことはほとんど何でもできます。

4

1 に答える 1

1

メニューバーの幅は簡単です: メニューバー画面の幅です。これには、アプリケーションのすべてのメニューが含まれます。

メニューが含まれている、画面全体にわたるメニュー バーのスクリーンショット。

それはLayersからのものなので、アプリでこれ以上うまくやれるとは思いません。

そのため、ステータス バーを差し引く必要があります。

これは、Quartz Window Services を使えば簡単です。

最初に、メイン メニュー ウィンドウ レベルで境界線がなく、不透明でなく、背景が透明な空のウィンドウを作成し、それを元戻します。つまり、実際のメイン メニューの背後に配置します。

次に、ウィンドウのウィンドウ番号を取得し、それを function に渡しCGWindowListCreate他のウィンドウのにあるすべてのウィンドウが必要であることを指定します。

堅牢性をさらに高めるには (カーソルや何かが含まれないようにするため)、同じことを反対方向に行います。 )、そのウィンドウの背後にあるウィンドウのリストを作成します。

両方のアレイにあるウィンドウは、メニュー バーとすべてのステータス アイテムです。メインメニュー画面( )と同じ幅のものが[NSScreen screens][0]メニューバーです。すべてのステータス アイテムの四角形を結合し、メニュー バーの四角形を切り取って、ステータス アイテムの四角形の原点で終了します。

これはすべて、メニューバーとステータス項目が特定の方法で編成されていることを前提としており、OS の更新で変更される可能性があることに注意してください。

于 2013-04-28T01:39:42.030 に答える