2010-05-28 1 views
11

LSUIElement = 1을 사용하는 배경 응용 프로그램에 몇 가지 문제가 있습니다. Command-Tab 응용 프로그램 전환기에 나타나지 않도록하십시오.Snow Leopard 및 LSUIElement -> 응용 프로그램이 제대로 활성화되지 않았습니다. "키"임에도 불구하고 "활성"창이 아닙니다.

스노우 레오파드에만 문제가있는 것 같습니다.

응용 프로그램은 메뉴 막대에 NSStatusItem을 놓고 클릭하면 메뉴를 팝업합니다. "환경 설정 ..."을 선택하면 환경 설정이있는 NSWindow가 나타나야합니다.

첫 번째로 작동하지 않는 것은 윈도우가 앞쪽에 정렬되지 않지만 다른 모든 응용 프로그램 창 뒤에 나타남을들 수 있습니다.

나는

[[NSApplication sharedApplication] activateIgnoringOtherApps: YES] 

를 호출하여이 문제를 해결하려하지만, 작동하지 않았다.

[자기 performSelector : 나는 메뉴가 전송되는 실행 루프에 메시지를 차단하고, 그래서이 MainController에 다른 방법을 쓰고 지연 메시지를 보낸 것으로 파악 잠시 후

@ 선택기 (setFront :) withObject : [preferencesController 창] afterDelay : 1.0];

-(void)setFront: (id) theWindow { 

[[NSApplication sharedApplication]activateIgnoringOtherApps:YES]; 
[theWindow orderFrontRegardless]; 
[theWindow makeKeyWindow]; 
     [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; 
} 

메시지 보내기 - 할 일 - 할 일 -해야할 일 - 접근 방식에주의하십시오.

이 기능은 모든 응용 프로그램의 다른 모든 창의 맨 위에있는 창을 맨 앞으로 가져옵니다. 그러나 대부분의 경우 활성화되어 있지 않으므로 제목 표시 줄이 회색으로 표시됩니다. 제목 표시 줄을 클릭해도 창이 활성화되지 않습니다. 창의 안쪽을 클릭하면 활성화됩니다!?

이 모든 것이 Leopard에서 문제가되지 않은 것 같습니다. activateIgnoringOtherApps를 호출하고 윈도우 키를 제대로 작동시키는 것처럼 보였습니다. '나는 그와 함께 주위를 해본 적이

http://developer.apple.com/mac/library/releasenotes/cocoa/appkit.html

하지만, SL 전용 및 I의 천국입니다 : 스노우 레오파드 (Snow Leopard)에서

는 동작을 에뮬레이트하도록되어 LSUIElement을 대체하기위한 새로운 API가 LSUIElement를 설정할 수있었습니다.

+0

당신이하려는 일은 초점을 훔치는 것으로 인식 될 수 있습니다. 그리고 그것은 좋은 일입니다. 당신의 메뉴는 무엇을합니까? '[preferencesController showWindow :]'? – zneak

+0

사용자가 "환경 설정 ..."을 선택하고 환경 설정 윈도우를 앞쪽으로 정렬하여 키로 지정할 때 포커스를 훔치는 일은 거의 없습니다. 그렇지만 사과에있는 훌륭한 사람들은 그렇게하지 못하게하려고합니다. –

답변

4

필사적으로 질문을 게시 한 후에도 계속 찾고 해결책을 찾았습니다. 이것으로 며칠 동안 저를 곤란하게 만들었고 Google이 찾을 수있는 다른 대답이없는 것처럼 보였습니다. 나는 "미래 세대"를위한 해결책을 설명 할 것입니다.

스노우 레오파드 (Snow Leopard)는 새로운 NSApplication presentationOptions API를 추가합니다 : 이것은 LSUIElement 작동하는 방식을 시뮬레이션하지만, 더 개발자 제어를 제공하도록되어

http://developer.apple.com/mac/library/releasenotes/cocoa/appkit.html

. 불행하게도, 시뮬레이션은 완벽하지 않으므로 10.5와 10.6 사이에서 동작이 변경됩니다.

특히 응용 프로그램의 info.plist에 LSUIElement = 1 행이 있으면 Snow Leopard는 "응용 프로그램의 presentationOptions .."를 초기화합니다.대신 NSApplicationPresentationOptions 플래그의 동등한 조합 "..

만 정말 그것은 NSApplicationActivationPolicyAccessory 새 NSApplication setActivationPolicy을 설정하지 않습니다

는"Dock에 표시되지 않습니다 응용 프로그램과는 메뉴 모음이없는 그러나 프로그래밍 방식으로 활성화하거나 창 중 하나를 클릭하여 활성화 할 수 있습니다. 이 프로그래밍 방식으로 활성화되는 응용 프로그램의 Info.plist가의 언급에도 불구 1. "

인의 LSUIElement 키 값에 해당, activateIgnoringOtherApps은 : 단순히 완전히 무시된다

이 솔루션에 활성화 정책을 설정하는 것입니다. "일반"당신이 자료 SDK, 몇 사람이 순간에하고 싶은 것을, 그래서 아래로 10.6 SDK를 사용하는 경우 물론

[[NSApplication sharedApplication] setActivationPolicy: NSApplicationActivationPolicyRegular]; 

, 당신 만이 할 수있는이 일의 10.5 안전한 방법입니다 :

NSApplication* app = [NSApplication sharedApplication]; 

if([app respondsToSelector: @selector(setActivationPolicy:)]) { 

    NSMethodSignature* method = [[app class] instanceMethodSignatureForSelector: @selector(setActivationPolicy:)]; 
    NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: method]; 
    [invocation setTarget: app]; 
    [invocation setSelector: @selector(setActivationPolicy:)]; 
    NSInteger myNSApplicationActivationPolicyAccessory = 0; 
    [invocation setArgument: &myNSApplicationActivationPolicyAccessory atIndex: 2]; 
    [invocation invoke]; 

} 

누군가가 유용하다고 생각합니다.

+0

불행하게도 이것은 효과적으로 Dock 아이콘을 다시 가져옵니다. – stephencelis

+0

예. 버머 – david

8

이상하게도 - 스노우 레오파드에서 LSUIElement 응용 프로그램을 쓰고 있습니다. 당신이 묘사 한 것과 같은 문제가 없었습니다 ... 새로 생성 된 윈도우가 프론트에서는 activateIgnoringOtherApps를 호출하여 문제를 해결했습니다. 이것은해야 할 일을하기 위해서 내가해야만하는 전부였습니다.

[NSApp activateIgnoringOtherApps: YES]; 
[preferencesWindow makeKeyAndOrderFront: self]; 

나는 이름에 '정책'이있는 것은 건드리지도 않았습니다.

+0

내가 경험 한 것은 활성화 정책과 다른 것 사이의 상호 작용이었다고 생각합니다. 활성화 정책을 선택하기위한 추가 코드가 몇 주 전에 나의 프로그램에서 제거되었지만 아무런 영향이 없었습니까? 그것은 단지 작동하지 않는 것들 중 하나이며, 갑자기 다시 잘 작동하기 시작합니다. 물론 OS X 포인트 업데이트 중 하나 일 수 있습니다. 아마도 제가 작업하고 있던 창문이 핵심이나 주요이 될 수 없었을 것입니다!? –

+0

이것은 나를 위해 일했습니다. 나는 같은 상황을 겪었다. 그러나 내 문제는 좀 더 이상했다. Xcode에서 실행하면 완벽하게 작동합니다. Finder에서 응용 프로그램을 실행하면 창이 나타나지 않습니다. 이 줄을 추가하면 정말 행복했습니다. – Vojto

+0

그것은 많은 두통을주고 있습니다. 이 우아한 솔루션에 감사드립니다. – Tibidabo