2013-02-25 14 views
6

Ich muss ein Fenster (ohne Titelleiste) über Anwendungen von Drittanbietern zeigen, ohne dass mein Fenster den Fokus hat.Fenster ohne Aktivierung anzeigen (Anwendung darunter aktiv halten)

Ich habe versucht, eine NSPanel und Einstellung aktivieren nicht aktivierend, aber das hat nicht geholfen.

Ich versuchte orderFront:self, aber das half auch nicht.

Ich musste immer [NSApp activateIgnoringOtherApps:YES]; hinzufügen, weil das Fenster sonst nicht angezeigt würde.

Ich habe hier ein Beispielprojekt für genau diese Funktionalität:
http://users.telenet.be/prullen/TopW2.zip

UIElement zu true in der plist-Datei der Anwendung festgelegt ist, so gibt es kein Dock. Sie können das Fenster aktivieren, indem Sie gleichzeitig ALT + SPACE drücken. Sie werden sehen, dass die App darunter den Fokus verliert. Irgendwelche Gedanken darüber, wie das zu beheben ist? Ich habe andere Apps gesehen, damit ich weiß, dass es möglich ist.

Edit: hier ist der Code so weit. Denken Sie daran, dass das Fenster ein nicht aktivierender NSPanel ist. Ich brauche immer noch die letzte NSApp activateIgnoringOtherApps Zeile oder sonst wird es nicht angezeigt. Aber das macht natürlich das Fenster zum aktiven. setHidesOnDeactivate behebt dieses, aber jetzt wird das Fenster nie verbergen OK, unchecking:

_windowController = [[MyWindowController alloc] initWithWindowNibName:@"MyWindowController"]; 

    [[_windowController window] setLevel:NSNormalWindowLevel+1]; 
    [[_windowController window] orderFrontRegardless]; 

    [_windowController showWindow:self]; 

    [NSApp activateIgnoringOtherApps:YES]; 

Ich habe auch subclassed NSPanel und fügte zwei Methoden:

- (BOOL)canBecomeKeyWindow 
{ 
    return YES; 
} 

- (BOOL)canBecomeMainWindow 
{ 
    return YES; 
} 

bearbeiten. Ich muss es ausblenden, wenn der Benutzer die App darunter drückt oder zu einer anderen App wechselt.

Edit 2: OK, scheint dies das oben genannte Problem zu beheben:

- (void)awakeFromNib 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(hideWindow) name:NSWindowDidResignKeyNotification object:nil]; 
} 
- (void)hideWindow { 
    [self setHidesOnDeactivate:YES]; 
} 

nicht sicher, ob ein besserer Weg gibt.

Und für diejenigen, die wissen wollen, wie das Fenster anzuzeigen:

[[_windowController window] setLevel:NSPopUpMenuWindowLevel]; 
    [[_windowController window] orderFrontRegardless]; 
    [[_windowController window] makeKeyWindow]; 

    [_windowController showWindow:self]; 

Antwort

3

eine dieser den Trick tun sollten:

  • Gebrauch nach vorne -[NSWindow orderFrontRegardless] erhalten ein normales Niveau Fenster ohne die entsprechende App zu aktivieren, oder
  • Verwenden Sie -[NSWindow setLevel:], um den Fensterpegel auf etwas höher als NSNormalWindowLevel
  • zu erhöhen
+0

dank zu ändern, leider immer noch nicht funktioniert. Ich muss noch die activateIgnoringOtherApps hinzufügen: True Call, sonst wird es nicht angezeigt. Und dieser Aufruf macht es natürlich zum aktiven Fenster. – Wesley

+2

@Wesley Deaktivieren Sie "Bei Deaktivierung ausblenden" für das Panel in Ihrer NIB. – puzzle

+2

Danke, warum habe ich nicht daran gedacht? Diese Option, zusammen mit OrderFrontRegardless und SetLevel, macht es endlich möglich. Vielen Dank! – Wesley

1

Nicht zu @ Puzzle die nützliche Antwort zu nehmen, aber es klingt wie Ihr Problem hat etwas mit einer NSPanel statt einer NSWindow zu tun.

Das „Wie Panels Work“ docs sagen:

  • Onscreen-Panels, mit Ausnahme der Alarm Dialoge, vom Bildschirm entfernt werden, wenn die Anwendung nicht aktiv ist und wiederhergestellt werden, wenn Sie die Anwendung erneut aktiv wird . Dies reduziert das Bildschirmecho.
  • Insbesondere die NSWindow-Implementierung der hidesOnDeactivate-Methode gibt NO zurück, aber die NSPanel-Implementierung der gleichen Methode gibt YES zurück.

So könnten Sie vielleicht hidesOnDeactivate außer Kraft setzen NO zurückzukehren, oder zu NSWindow

+0

Ich denke, das Problem ist in der NIB, hideOnDeactivate wird dort überprüft. – puzzle

+0

Ich habe beim Deaktivieren deaktiviert, aber jetzt versteckt sich das Panel nie. Nicht wenn ich auf die App darunter klicke, nicht wenn ich zu einer anderen App wechsle. irgendwelche Ideen? – Wesley