2012-06-22 3 views
0

У меня есть приложение LSUIElement, которому необходимо сохранить его статус LSUIElement (у него не может быть значок док-станции) это приложение запускается и обрабатывается плагином.Принудительное приложение LSUIElement «Аксессуар» на передней панели

Когда я меняю приложение так, что это «обычное» приложение (без LSUIElement), [NSApp activateIgnoringOtherApps:YES] работает отлично. Однако, когда я делаю это LSUIElement, он показывает окно, но окно застряло за сафари (где работает плагин), но поверх всего остального. Я звоню -[NSWindow makeKeyAndOrderFront:self];, но это не имеет никакого значения.

Чтобы быть понятным, сторона «плагин» не имеет значения, поскольку плагин и приложение являются двумя отдельными процессами. Плагин отправляет событие (через машинный порт) в приложение, которое вызывает некоторый код, чтобы открыть окно и привлечь его к фокусу. Проблема заключается в том, что код для его фокусировки работает только тогда, когда это не приложение LSUIElement.

Я исчерпывающе искал существующий звонок, чтобы сделать эту работу, я открыт для предложений о том, как подделать щелчок мышью или даже запустить некоторый applescript, чтобы сделать эту работу, возможно, есть недокументированный метод выполнения этого ,

Документы Apple для LSUIElement Состояние «Приложение не отображается в Доке и не имеет панели меню, но может быть активировано программно», но я не могу найти магию, которая позволяет это.

+0

pzich in freenode #macdev предлагается [NSWindow setLevel:]; установив, что NSMainMenuWindowLevel выводит его перед сафари, однако окно все еще не является ключевым. –

+0

Я не понимаю этот вопрос. '[NSApp activateIgnoringOtherApps: YES]' - как вы должны перенести свое приложение вперед. Это не должно заставлять ваше приложение «удалять LSUIElement» и показывать значок док-станции. Вы действительно видите значок док-станции? –

+0

Курт, просто сформулированный плохо. Теперь он отредактирован для ясности. –

ответ

0

Следующий подход работает для меня в приложение с «LSUIElement» установлен в «1», даже если все приложения с использованием какао:

ProcessSerialNumber psn; 
if (noErr == GetCurrentProcess(&psn)) 
{ 
    (OSStatus)SetFrontProcess(&psn); 
} 

(Это часть Carbon API.)

+0

Пробовал это, чтобы иметь возможность поднимать мои вспомогательные окна, когда другое хост-приложение переходит в полноэкранный режим - похоже, не работает. – Danra

0

Вам нужно активировать приложение первым:

[NSApp activateIgnoringOtherApps:YES]; 

, а затем сделать ваше окно станет ключевым окно:

[NSWindow makeKeyAndOrderFront:nil]; 

Это работает в моем проекте.

Смежные вопросы