2017-12-29 7 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; 
} 

이 코드는, 그러나, 메뉴를 얻는 것은 표시하기 위해 노력 또는 "초점은"다소 엉뚱한입니다. Dock에있는 아이콘을 마우스 오른쪽 버튼으로 클릭하고 상황에 맞는 메뉴를 볼 수 있습니다. 아이콘을 클릭하면 앱을 정상적으로 종료 할 수있는 메뉴가 표시됩니다. 이라는 단어는 때때로입니다. 아직 메뉴를 표시 할 특정 트리거가 있는지 알지 못했습니다.

(주로 비어있는) 메뉴를 예상대로 표시하거나 초점을 맞추기 위해이 코드를 편집 할 수 있습니까? 무엇이든 창없이 할 수 있습니까?

Windows에서는 아이콘 전용 프로그램을 만드는 것이 가능했지만 최소한 그려지는 창은 최소화 된 아이콘이었으며 적절한 창을 "복원"할 방법이 없었습니다. Cocoa에서 비슷한 기술이 작동한다면, 나는 그것을 "속임수이지만 수용 가능한 해결책"이라고 부를 것입니다.

+0

그건 이미 앱의 일부입니다. 'id menubar'에서 내려. –

답변

0

"가끔은"단순히 마우스 왼쪽 버튼을 누른 상태에서 지연된 메뉴 표시를 트리거 할만큼 길게 누르는 것일 수 있습니다. Dock에서 아이콘을 클릭 할 때 실제로 메뉴가 표시되는 것은 응용 프로그램 자체에서 어떤 식 으로든 제어되지 않으므로 잘못된 트리를 짖고있는 것입니다.

당신이하려는 일에 특별한 것이 없습니다. 창이 열리도록 응용 프로그램이 필요하지 않습니다. 창문을 원하지 않는다면 괜찮습니다. 그냥 아무 것도 만들지 마라. 그러나 해당 응용 프로그램이 Dock에 표시되면 (표준과 마찬가지로) 해당 응용 프로그램은 "활성화 가능"하게되고 메뉴 표시 줄이 생깁니다 (확실히 비어 있지만 여전히 존재할 수 있음). 이러한 응용 프로그램은 비정상적이며 모든 Mac 사용자에게 "고장"하다고 느끼게됩니다.

는 대신 할 수있는 적절한 것은 하지이 (NSApplicationActivationPolicyAccessory를 사용하여) Dock에 나타나지 않는 응용 프로그램을 작성하고, 메뉴 바에서 (는 "상태 항목"이라고 함) 글로벌 메뉴가 있습니다. NSStatusItem을 참조하십시오.

관련 문제