2015-05-02 6 views
0

Я пытаюсь создать виртуальную клавиатуру в Objective-C/Cocoa/OS X. Клавиатурное окно представляет собой панель HUD. Как я могу сделать, чтобы панель не стала ключевой, если я нажимаю на клавиатуру?Сделать ключ NSPanel/NSWindow вручную или не стать ключом

Я уже пробовал следующий подход в - (void)windowDidBecomeKey:(NSNotification *)notification -метода (которые получают называется), но он не работает:

NSDisableScreenUpdates(); 
[_window orderOut:self]; 
[_window orderFront:self]; // Not asking it to be key 
NSEnableScreenUpdates(); 

И то же самое с nil вместо self. Есть идеи?


Edit 1: Я попытался установить свойство, как это и это работает, но разрушает HUD-стиль:

[_window setStyleMask:NSHUDWindowMask | NSNonactivatingPanelMask]; 

Если я делаю это HUD-стиль там еще раз, но и окно снова становится ключом:

[_window setStyleMask:NSHUDWindowMask | NSTitledWindowMask | NSNonactivatingPanelMask]; 

Edit 2: Теперь я также попытался подклассов и добавил следующий код KeyboardPane п.м.:

- (BOOL)canBecomeKeyWindow { 
    return NO; 
} 

Теперь NSLog(@"Can become key window: %hhd", _window.canBecomeKeyWindow) возвращается 0, но панель становится ключом, тем не менее ...

ответ

2

Используйте NSPanel и установите его свойство becomesKeyOnlyIfNeeded истина. Возможно, вы также захотите использовать NSNonactivatingPanelMask в маске стиля для панели.


Update:

Поскольку вы никогда не хотите, чтобы ключ панели стали, вы можете просто использовать пользовательский подкласс, который переопределяет -canBecomeKeyWindow вернуть ложь:

- (BOOL) canBecomeKeyWindow 
{ 
    return NO; 
} 
+0

Трюк с NSNonactivatingPanelMask работает, но как я могу сохранить титульный HUD-стиль с помощью этого стиля-свойства? Это воссоздает название-HUD-стиль: setStyleMask: NSHUDWindowMask | NSTitledWindowMask | NSNonactivatingPanelMask , но затем он снова становится ключом ... –

+0

Вы установили 'станетKeyOnlyIfNeeded'? –

+0

Yap, но это, кажется, не имеет эффекта ... –

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