10

You all know the menu bar (or better said NSStatusBar) in Mac OS X.
There are some items which I can move and other which not.

I would like to be able to drag the NSStatusItem of my app.

Any idea how to implement this?

4

3 に答える 3

20

NSStatusItems は Apple の内部「メニュー エクストラ」の近くに表示されますが、それらは明確に区別され、異なる動作をします。Apple がメニュー バーの右側の領域に表示できる項目を統一してくれるといいのですが、今のところ、このセクションは個別の「Apple 内部」(右側) と「アプリ提供 (NSStatusItem)」に分割されています。 " 左に。

コンピューターをスクリーン キャプチャ モード (cmd-shift-4) にし、スペース バーを押して「ウィンドウ全体をキャプチャする」に切り替えると、違いを視覚化できます。Apple のメニュー アイコンにカーソルを合わせると、それらがすべて 1 つのウィンドウに表示されていることがわかります。これは、簡単に管理およびドラッグできる能力を説明しています。他のアイテムにカーソルを合わせると、各 NSStatusItem が実際にはそれ自体の 1 つのウィンドウ内にあることがわかります (このウィンドウは、たまたまそれをインストールしたアプリケーションによって所有されています)。

ドラッグできなくても、NSStatusItem を使用することをお勧めします。これは Apple の欠点であり、ほとんどのユーザーは理解できるでしょう。より安定したアプリケーションを長期的に提供することのプラスのトレードオフを強調すると、通常、ドラッグ可能性を求める顧客 (またはマネージャー?) の意見が和らぎます。

于 2009-03-08T17:58:14.123 に答える
14

NSMenuExtraではなくを使用しNSStatusItem、メニュー項目をSystemUIServer独自のアプリではなく、プロセス内で実行されるバンドルにする必要があります。これを機能させるには、MenuCracker が提供するようなコードも必要です。

NSMenuExtra文書化されておらず、サポートされていないため、「ハック」と見なされます。

そもそも 2 つの API があると推測します。メニューの余分なクラッシュ (またはメモリ リーク) は、SystemUIServer プロセス全体がクラッシュするか、メモリ リークが発生することを意味します。これには、他のサード パーティ モジュールやシステム提供のモジュールも含まれます。一方、ステータス項目では、このような問題は自分のコードにのみ影響します。

于 2009-03-08T16:52:34.047 に答える