2013-02-25 9 views
6

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]; 

Odpowiedz

3

jeden z tych powinno załatwić sprawę:

  • Korzystając -[NSWindow orderFrontRegardless] dostać normalne okno poziom do przodu bez aktywowania odpowiedniej aplikacji, lub
  • Użyj -[NSWindow setLevel:], aby zwiększyć poziom okna do wartości wyższej niż NSNormalWindowLevel
+0

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

+2

@Wesley Usuń zaznaczenie pola wyboru "Ukryj przy dezaktywacji" dla panelu w Twoim NIB. – puzzle

+2

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

1

Aby nie odbierać użytecznej odpowiedzi @ puzzle, ale wygląda na to, że twój problem ma coś wspólnego z używaniem NSPanel zamiast z NSWindow.

„Jak Panele pracy” docs powiedzieć:

  • ekranowej panele, oprócz dialogów alarmowych, są usuwane z ekranu, gdy aplikacja nie jest aktywna i są przywracane, gdy aplikacja ponownie staje się aktywna . Zmniejsza to bałagan na ekranie.
  • W szczególności, implementacja NSWindow metody hidesOnDeactivate zwraca NO, ale implementacja NSPanel tej samej metody zwraca TAK.

Więc może można zastąpić hidesOnDeactivate wrócić NO, lub zmienić NSWindow

+0

Myślę, że problem jest w NIB, ukryty tam jest zaznaczone. – puzzle

+0

Usunąłem zaznaczenie ukryj przy dezaktywacji, ale teraz panel nigdy się nie ukryje. Nie po kliknięciu aplikacji poniżej, a nie po przejściu do innej aplikacji. jakieś pomysły? – Wesley

Powiązane problemy