Сделать ключ NSBordlessWindow активным, когда главное окно приложения не активно

У меня есть пользовательское окно NSBorderlessWindowMask в моем приложении, которое я показываю, когда пользователь нажимает определенную горячую клавишу. Это окно имеет `NSTextField, который должен стать первым ответчиком, когда окно появится. Это окно не является главным окном, но оно может переместить фокус из главного окна. Это то, что я делаю, чтобы показать это и сделать его ключевым:

[self.myCustomWindow makeKeyAndOrderFront:sender];

а затем установить первого ответчика

[self.myTextField becomeFirstResponder];

Все работает, как и ожидалось, когда приложение является самым передним приложением, но если это не так, окно появляется, но не становится ключевым, и мне нужно щелкнуть его, чтобы стать активным.

Я переопределяю свой класс CustomWindow:

- (BOOL)canBecomeKeyWindow {

    return YES;
}

В чем может быть проблема?

Спасибо!




Ответы (1)


Согласно Руководству по обработке событий Cocoa , только самое переднее приложение может иметь статус главного и ключевого окна:

Когда приложение отображает как главное окно, так и ключевое окно, цепочки респондентов обоих окон могут быть вовлечены в сообщение о действии. Как объяснялось в разделе «Распределение окон и типы окон», главное окно — это самое переднее окно документа или приложения. Часто главные окна также имеют ключевой статус, что означает, что они в данный момент находятся в центре внимания пользователя. Но с главным окном может быть связано вторичное окно или панель, например панель «Поиск» или информационное окно, в котором отображаются сведения о выделении в окне документа. Когда это вторичное окно находится в фокусе пользовательского ввода, оно является ключевым окном.

Я не вижу никакого способа обойти это.

РЕДАКТИРОВАТЬ: также из Руководство по программированию в Windows:

Поскольку ключевое окно принадлежит активному приложению, его выделенная строка заголовка имеет дополнительный эффект, помогая показать, какое приложение активно в данный момент. Ключевое окно — это наиболее заметное окно в активном приложении, что делает его «ключевым» во втором смысле: это основной фокус внимания пользователя на экране.

person Droppy    schedule 29.07.2014
comment
Но мне не нужно, чтобы он стал основным. Я просто хочу, чтобы это стало ключевым. Мне просто нужно сосредоточиться на текстовом поле, поэтому оно становится первым ответчиком, когда окно становится из окна - person Nava Carmon; 29.07.2014
comment
@NavaCarmon Добавил еще одну цитату из документа Apple. Ключевое окно принадлежит активному приложению. Я не понимаю, как это можно легко изменить. - person Droppy; 29.07.2014
comment
Я попытался добавить [NSAppactivateIgnoringOtherApps:YES], прежде чем сделать его ключевым, и он работает. - person Nava Carmon; 29.07.2014