2017-12-29 34 views
1

これは学問的な質問では単純ですが、これは可能ですが、実際の目的はありません。Objective-C:Cocoaアプリケーションを「メニューのみ」のアプリケーションにすることはできますか?

minimalistic example hereで遊んで、私は窓を削除し、アプリを "メニューのみ"にする明るいアイデアを思いついた。

これが結果のコードです。

#import <Cocoa/Cocoa.h> 

int main() { 
    [NSAutoreleasePool new]; 
    [NSApplication sharedApplication]; 
    [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; 

    id menubar = [[NSMenu new] autorelease]; 
    id appMenuItem = [[NSMenuItem new] autorelease]; 
    [menubar addItem:appMenuItem]; 
    [NSApp setMainMenu:menubar]; 

    id appMenu = [[NSMenu new] autorelease]; 
    id appName = [[NSProcessInfo processInfo] processName]; 

    id quitTitle = [@"Quit " stringByAppendingString:appName]; 
    id quitMenuItem = [[[NSMenuItem alloc] initWithTitle:quitTitle 
     action:@selector(terminate:) keyEquivalent:@"q"] autorelease]; 

    [appMenu addItem:quitMenuItem]; 
    [appMenuItem setSubmenu:appMenu]; 

    // Window code deleted 

    [NSApp activateIgnoringOtherApps:YES]; 
    [NSApp run]; 

    return 0; 
} 

このコードは機能しますが、メニューを表示したりフォーカスを合わせたりするのは多少不安定です。ドック内のアイコンを右クリックしてコンテキストメニューを表示することもできます。アイコンをクリックすると、すべて正常に終了するメニューが表示されます。単語は時々に注意してください。メニューを表示させる特定のトリガがあるかどうかはまだわかりません。

(ほとんど空の)メニューを予測可能に表示するか、フォーカスを当てるようにこのコードを編集できますか?まったく窓なしでこれを行うことはできますか?

Windowsでは、描画するウィンドウが最小化されたアイコンであり、適切なウィンドウを「復元」する方法がないアイコン専用のプログラムを作成することは少なくとも可能でした。同様の手法がCocoaで動作するなら、私はそれを「不正行為だが容認できる解決策」と呼ぶだろう。

+0

これは既にアプリの一部です。 'id menubar'からダウン。 –

答えて

0

「時々」は、マウスの左ボタンを押したままにすると、メニューの遅延表示をトリガするのに十分長い時間をクリックしているだけである可能性があります。 Dockのアイコンをクリックしたときのメニューの実際の表示は、アプリケーション自体によって決して制御されないので、間違ったツリーを吠えてしまいます。

あなたがしようとしていることについて何も特別なことはありません。ウィンドウを開くためのアプリケーションは必要ありません。あなたが窓を望んでいなければ、大丈夫です。ただ作成しないでください。しかし、そのアプリケーションがDock(標準である)に表示される場合、そのアプリケーションは「アクティブ化可能」になり、メニューバーを表示します(これは確かに空ですが、依然として存在します)。このようなアプリケーションは異常で、すべてのMacユーザーにとって「壊れた」と感じます。

代わりに、行うには、適切なものはは(NSApplicationActivationPolicyAccessoryを使用して)Dockに表示され、メニューバーの(「ステータス項目」と呼ばれる)グローバルメニューを持っていません。アプリケーションを作成することですNSStatusItemを参照してください。

関連する問題