Muszę pokazać okno (bez paska tytułu) nad aplikacjami innych firm bez ustawiania ostrości przez okno.Pokaż okno bez aktywacji (aplikacja pozostaje poniżej aktywna)
Próbowałem użyć NSPanel
i ustawienie umożliwiające unieaktywnienie, ale to nie pomogło.
Próbowałem orderFront:self
, ale to też nie pomogło.
Zawsze musiałem dodać [NSApp activateIgnoringOtherApps:YES];
, ponieważ okno nie pokazywałoby inaczej.
mam tutaj przykładowy projekt tylko dla tej funkcji:
http://users.telenet.be/prullen/TopW2.zip
UIElement
jest ustawiony na true
w pliku plist aplikacji, więc nie ma dok. Możesz aktywować okno wciskając ALT + SPACE
w tym samym czasie. Zobaczysz, że aplikacja poniżej traci ostrość. Wszelkie przemyślenia, jak to naprawić? Widziałem, jak robią to inne aplikacje, więc wiem, że to możliwe.
Edytuj: Oto kod do tej pory. Pamiętaj, że okno to nie aktywujący NSPanel. Ciągle potrzebuję ostatniej linii NSApp activateIgnoringOtherApps
lub w inny sposób jej nie wyświetlam. Ale to oczywiście sprawia, że okno jest aktywne.
_windowController = [[MyWindowController alloc] initWithWindowNibName:@"MyWindowController"];
[[_windowController window] setLevel:NSNormalWindowLevel+1];
[[_windowController window] orderFrontRegardless];
[_windowController showWindow:self];
[NSApp activateIgnoringOtherApps:YES];
Ja również podklasy NSPanel i dodał dwie metody:
- (BOOL)canBecomeKeyWindow
{
return YES;
}
- (BOOL)canBecomeMainWindow
{
return YES;
}
EDIT: Ok, odznaczając setHidesOnDeactivate poprawki, ale teraz okno nie ukryje. Potrzebuję go ukryć, gdy użytkownik naciśnie aplikację poniżej lub przełącza się do innej aplikacji.
Edit 2: OK, to wydaje się rozwiązać powyższy problem:
- (void)awakeFromNib
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hideWindow) name:NSWindowDidResignKeyNotification object:nil];
}
- (void)hideWindow {
[self setHidesOnDeactivate:YES];
}
Nie jestem pewien, czy istnieje lepszy sposób.
A dla tych, którzy chcą wiedzieć, jak wyświetlić okno:
[[_windowController window] setLevel:NSPopUpMenuWindowLevel];
[[_windowController window] orderFrontRegardless];
[[_windowController window] makeKeyWindow];
[_windowController showWindow:self];
dzięki, niestety nadal nie działa. Nadal muszę dodać activIgnoringOtherApps: true call, w przeciwnym razie nie pojawi się. A to wywołanie oczywiście sprawia, że jest to aktywne okno. – Wesley
@Wesley Usuń zaznaczenie pola wyboru "Ukryj przy dezaktywacji" dla panelu w Twoim NIB. – puzzle
Dzięki, dlaczego o tym nie pomyślałem? Ta opcja wraz z orderFrontRegardless i setLevel sprawiają, że to działa, w końcu. Dziękuję Ci! – Wesley