2010-10-15 33 views
28

In Windows, qual è la differenza tra primo piano e finestra attiva? Per essere precisi, in quali circostanze una finestra in primo piano non può essere una finestra attiva? Se i 2 termini si riferiscono allo stesso concetto, perché ci sono 2 termini.Primo piano Vs Finestra attiva

la documentazione MSDN qui parla di "cliccando su una finestra, o utilizzando il ALT +TAB o ALT +ESC combinazione di tasti" fa una finestra attiva e in primo piano. Non c'è nulla di esplicito sulla differenza tra i 2 termini.Check MSDN.

risposta

37

La finestra attiva (il risultato di GetActiveWindow()) è la finestra allegata al thread chiamante che viene immessa. La finestra in primo piano (il risultato di GetForegroundWindow()) è la finestra che sta attualmente ricevendo input indipendentemente dalla sua relazione con il thread chiamante. La finestra attiva è essenzialmente localizzata nella tua applicazione; la finestra in primo piano è globale per il sistema.

Ad esempio, se una finestra appartenente a un altro processo è il primo piano, chiamando GetActiveWindow() dal proprio processo verrà restituito NULL.

Credo che sia vero che essere la finestra in primo piano implica essere la finestra attiva, ma il contrario non è vero.Si noti inoltre che nelle moderne versioni di Windows, generalmente, le applicazioni non possono utilizzare SetForegroundWindow() per sottrarre lo stato attivo da un altro processo (a meno che tale processo non abbia dato esplicitamente il permesso tramite AllowSetForegroundWindow).

+1

Questa è la risposta giusta. È anche utile leggere [questo post del blog] (http://blogs.msdn.com/b/oldnewthing/archive/2008/10/06/8969399.aspx). – Ruslan

+0

Non è strettamente vero che chiamare 'GetActiveWindow' da un thread in background restituisce' NULL'. È possibile attivare la finestra di un thread in background, senza renderla la finestra in primo piano (ad es. Chiamando 'SetForegroundWindow' senza soddisfare i requisiti, o se passi ad un'altra applicazione tra l'avvio di un'applicazione e l'applicazione che mostra la sua interfaccia utente). Hai quasi ragione sulla finestra attiva, tuttavia: la finestra attiva è virtualizzata per ** thread ** (o gruppo thread di input-input), non per applicazione o processo. – IInspectable

+0

La risposta precedente che ho accettato è stata in seguito modificata e non ha molto senso per me ora. Quindi, ho cambiato la mia risposta accettata a questo, dopo 5 e 1/2 anni !!!!!!!!!!!!!!!!!!!!!! – JavaMan

8

trovo la descrizione in MSDN un po 'di confusione pure, ma qui è il mio prendere rivisto:

Prima un primo piano e sfondo della finestra non hanno nulla a che fare con le finestre attive, ha a che fare con la filettatura, vedi sotto. Quindi è tecnicamente possibile avere una finestra di sfondo come finestra attiva, ma è confusa e il sistema non fa questo per te, invece la tua app deve chiamare per es. SetWindowPos per rendere attiva la finestra di sfondo.

Il sistema può avere solo una finestra attiva di primo livello alla volta, il sistema attiverà la finestra di livello superiore se si sta lavorando su una finestra secondaria. Tutto l'input viene quindi indirizzato alla finestra attiva e quindi normalmente passato alla finestra secondaria.

/----------------------\ 
|      | 
| FOREGROUND WINDOW |--\ 
|      | | 
\----------------------/ | 
    | BACKGROUND WINDOW  | 
    \-----------------------/ 

/----------------------\ 
|      | 
| ACTIVE WINDOW  |--\ 
|      | | 
\----------------------/ | 
    | BACKGROUND WINDOW  | 
    \-----------------------/ 

Da MSDN

finestra attiva

una finestra attiva è la finestra di primo livello dell'applicazione con cui l'utente sta lavorando. Per consentire all'utente di identificare facilmente la finestra attiva, il sistema lo colloca all'inizio dell'ordine z e cambia il colore della barra del titolo e del bordo ai colori della finestra attiva definiti dal sistema. Solo una finestra di livello superiore può essere una finestra attiva. Quando l'utente sta lavorando con una finestra secondaria, il sistema attiva la finestra principale di livello superiore associata alla finestra secondaria.

primo piano/sfondo

Ogni processo può avere più thread di esecuzione, e ogni thread può creare finestre. Il thread che ha creato la finestra con cui sta lavorando l'utente è chiamato thread in primo piano e la finestra è chiamata finestra in primo piano. Tutti gli altri thread sono thread in background e le finestre create da thread in background sono chiamate background windows.

+0

Microsoft ha detto che una finestra in primo piano (appartiene al thread in primo piano) ha più priorità. Nel tuo terzo caso, È ACTIVE WINDOW ha ricevuto lo stesso privilegio? – pinichi

+0

msdn's descrizione della finestra attiva: * Una finestra attiva è la finestra di livello superiore dell'applicazione con la quale l'utente sta attualmente lavorando. Per consentire all'utente di identificare facilmente la finestra attiva, il sistema lo colloca nella ** parte superiore dell'ordine z ** e cambia il colore della barra del titolo e del bordo ai colori della finestra attiva definiti dal sistema. Solo una finestra di livello superiore può essere una finestra attiva. Quando l'utente sta lavorando con una finestra secondaria, il sistema attiva la finestra padre di livello superiore associata alla finestra secondaria. * Quindi è possibile avere il 3 ° caso sopra indicato? – JavaMan

+2

Sì, è possibile. Una finestra Alway On Top (con WS_EX_TOPMOST) può sovrapporsi a una finestra attiva (sfocatura della barra del titolo, selezionare testo non hightling, cursore del testo ... comunque) – pinichi