2016-01-05 12 views
8

Ho bisogno di creare una "finestra di sovrapposizione a schermo intero" in un programma per OS X. Precisamente, la finestra deve sempre essere in cima a tutte le altre finestre, inclusa la parte superiore della barra dei menu in spazi non ingranditi e in cima alle finestre ingrandite nei propri spazi e in cima durante Exposé. Non deve partecipare alle animazioni "cambia spazio"; cioè, la sua posizione deve essere fissa rispetto allo schermo fisico in ogni momento. (La finestra sarà semitrasparente e ignorerà gli eventi del mouse, ma so già come farlo.)Come posso creare una finestra di Cocoa che appare sopra le finestre a schermo intero?

Come posso ottenere questo comportamento di "finestra sovrapposta"? Ho avuto fino a questo punto:

  • devo impostare il window.level-CGWindowLevelKey(kCGMaximumWindowLevelKey) in modo che sia sempre in primo piano rispetto alle altre finestre nello stesso spazio.
  • Devo impostare NSWindowCollectionBehaviorStationary in modo che la finestra rimanga in posizione durante Exposé.

Quello che non so è come mantenere questo comportamento quando si cambia spazio. Ho pensato di impostare NSWindowCollectionBehaviorCanJoinAllSpaces, ma il suo comportamento presenta due problemi:

  • La finestra non viene visualizzata sopra altre finestre a schermo intero.
  • La finestra è duplicata su ogni spazio, piuttosto che stare nello stesso posto sopra tutti gli spazi. Questo è importante a causa dell'animazione dello spazio-switch.

I have heard that an NSPanel would help me, ma non sono riuscito a farlo funzionare.

In breve, È possibile che una finestra compaia in una finestra a schermo intero in OS X? Puoi fornire un esempio breve e completo?

+0

Non credo che tu abbia trovato una risposta per questo? Ho anche bisogno di visualizzare una finestra in cima alla finestra a schermo intero di un'altra app. –

+0

@MarkBessey Ho effettivamente trovato una soluzione, usando 'NSPanel'. Cercherò di rispondere alla domanda con qualche codice di esempio quando ho un momento – jameshfisher

+0

@jameshfisher Puoi condividere la tua soluzione? Ho un problema simile e ho provato quello che hai menzionato nella descrizione, ma sfortunatamente non funzionano. –

risposta

1

Si dovrebbe usare window.level = CGWindowLevelForKey(.MaximumWindowLevelKey).

Non posso aiutarti con gli spazi.

+0

Ah, sì, lo stavo già facendo - mi dispiace per non essere chiaro. Ho modificato la mia domanda. – jameshfisher

0

ecco la mia soluzione, funziona bene.

NSPanel *test_panel = [[NSPanel alloc] initWithContentRect:NSMakeRect(300, 300, 500, 500) styleMask:NSTitledWindowMask|NSClosableWindowMask backing:NSBackingStoreBuffered defer:YES]; 
[test_panel setReleasedWhenClosed:YES]; 
[test_panel setHidesOnDeactivate:NO]; 
[test_panel setFloatingPanel:YES]; 
[test_panel setStyleMask:NSBorderlessWindowMask | NSNonactivatingPanelMask]; 
[test_panel setLevel:kCGMainMenuWindowLevel-1]; 
[test_panel setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces|NSWindowCollectionBehaviorFullScreenAuxiliary]; 
[test_panel setCanBeVisibleOnAllSpaces:YES]; 
[test_panel center]; 
[test_panel orderFront:nil]; 
Problemi correlati