2010-12-19 14 views
6

Ich habe eine NSStatusItem, die ordnungsgemäß in der MenuBar angezeigt wird. Eines der Elemente (wenn es angeklickt wird) zeigt ein modales NSWindow aus meiner Anwendung an, das eine einmalige Aufgabe ausführen soll und dann verschwinden soll. (ZB der Benutzer gibt ein wenig Text ein, klickt auf "Speichern", und das modale NSWindow verschwindet.)Anzeigen eines modalen NSWindow, ohne die anderen Anwendungsfenster zu aktivieren

Das Problem tritt auf, wenn die Anwendung im Hintergrund ausgeführt wird. Das modale Fenster wird ordnungsgemäß oberhalb der Anwendung angezeigt, die im Vordergrund ausgeführt wird. Wenn der Benutzer jedoch auf die Schaltfläche "Speichern" klickt, werden die übrigen Fenster der Anwendung ebenfalls aktiviert. Dies ist unerwünscht, da der Benutzer dann auf die von ihm verwendete App zurückklicken muss. (Zerstörung der Bequemlichkeit des NSStatusItem.) Ich bin die Anzeige des modalen Fenster mit:

[myWindow setFrame:finalRect display:YES animate:NO]; 
[myWindow setLevel:NSPopUpMenuWindowLevel]; 
[NSApp runModalForWindow:myWindow]; 

Gibt es eine Möglichkeit Klicks/Ereignisse in meinem Popup-Fenster aus, woraufhin der Rest der Anwendung zu verhindern, aktiv zu werden? Oder eine Möglichkeit, NSApp wissen zu lassen, dass dieses bestimmte Panel den Rest der App nicht automatisch aktivieren soll? Vielen Dank!

Antwort

16

Anstatt ein NSWindow schaffen, ein NSPanel mit dem NSNonactivatingPanelMask Stil erstellen. Sie können dann die üblichen makeKeyAndOrderFront: und orderOut: zum Anzeigen/Ausblenden Panel nach Bedarf tun.

+0

Funktioniert perfekt (und einfach), danke! –

1

Eine Lösung von Ken Thomases auf dem Kakao-dev Liste vor ein paar Jahren sieht auch hier anwendbar:

[[NSApplication sharedApplication] hide:self]; 
[[NSApplication sharedApplication] performSelector:@selector (unhideWithoutActivation) withObject:nil afterDelay:0.05]; 

in der Theorie, die die Anwendung erklärt sich zu verstecken und am unteren Rand des Fensters Stapel sichtbar machen.

Sie könnten auch das Mausklick-Ereignis abfangen und verwenden [NSApp preventWindowOrdering]

+0

Danke, werde ich es versuchen und lassen Sie wissen, wie es funktioniert. –

+0

Nein, wenn Sie irgendwo in dieses Fenster klicken, werden die zugehörigen Anwendungsfenster immer noch im Vordergrund angezeigt. –

0

Sie können wie etwas versuchen:

... 
if ([NSApp isHidden]) 
    [myWindow makeKeyAndOrderFront:self]; 
else 
    [NSApp runModalForWindow:myWindow]; 
... 

und wenn Oberfläche:

... 
if ([NSApp isHidden]) 
    [myWindow orderOut:self]; 
else 
    [NSApp stopModal]; 
... 
Verwandte Themen