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.
fonte
2010-10-15 07:48:33
Questa è la risposta giusta. È anche utile leggere [questo post del blog] (http://blogs.msdn.com/b/oldnewthing/archive/2008/10/06/8969399.aspx). – Ruslan
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
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