2010-10-15 23 views
28

Sous Windows, quelle est la différence entre le premier plan et la fenêtre active? Pour être précis, dans quelles circonstances une fenêtre de premier plan peut-elle ne pas être une fenêtre active? Si les 2 termes font référence au même concept, pourquoi y a-t-il 2 termes?Premier plan Vs Fenêtre active

La documentation msdn ici mentionne "en cliquant sur une fenêtre, ou en utilisant le ALT +TAB ou ALT +ESC combinaison de touches" fait une fenêtre active, ainsi que de premier plan. Il n'y a rien explicitement sur la différence entre les 2 termes. Vérifiez MSDN.

Répondre

37

La fenêtre active (le résultat de GetActiveWindow()) est la fenêtre attachée au thread appelant qui est entrée. La fenêtre de premier plan (le résultat de GetForegroundWindow()) est la fenêtre qui reçoit actuellement une entrée indépendamment de sa relation avec le thread appelant. La fenêtre active est essentiellement localisée dans votre application. la fenêtre de premier plan est globale au système. Par exemple, si une fenêtre appartenant à un autre processus est le premier plan, l'appel GetActiveWindow() à partir de votre propre processus renverra NULL.

Je crois qu'il est vrai qu'être la fenêtre de premier plan implique d'être la fenêtre active, mais l'inverse n'est pas vrai.Notez également que dans Windows moderne, les applications ne peuvent généralement pas utiliser SetForegroundWindow() pour dérober un autre processus (sauf si ce processus a explicitement donné l'autorisation via AllowSetForegroundWindow).

+1

Ceci est la bonne réponse. Il est également utile de lire [cet article de blog] (http://blogs.msdn.com/b/oldnewthing/archive/2008/10/06/8969399.aspx). – Ruslan

+0

Il n'est pas strictement vrai que l'appel 'GetActiveWindow' d'un thread d'arrière-plan renvoie' NULL'. La fenêtre d'un thread d'arrière-plan peut être activée, sans en faire la fenêtre de premier plan (par exemple en appelant 'SetForegroundWindow' sans répondre aux exigences, ou si vous passez à une autre application entre le lancement d'une application et l'application montrant son interface utilisateur). Cependant, vous avez presque raison sur la fenêtre active: La fenêtre active est virtualisée par ** thread ** (ou groupe de threads attaché à une entrée), pas par application ou par processus. – IInspectable

+0

La réponse précédente que j'ai acceptée a été éditée plus tard et a peu de sens pour moi maintenant. Donc, j'ai changé ma réponse acceptée à ceci, après 5 et 1/2 ans !!!!!!!!!!!!!!!!!!!! – JavaMan

8

je trouve la description dans MSDN un peu déroutant aussi bien, mais voici mon révisée:

D'abord un premier plan et la fenêtre d'arrière-plan ont rien à voir avec les fenêtres actives, il doit faire avec filetage, voir ci-dessous. Il est donc techniquement possible d'avoir une fenêtre d'arrière-plan en tant que fenêtre active, mais cela crée de la confusion et le système ne fait pas cela pour vous, mais votre application doit appeler par ex. SetWindowPos pour activer la fenêtre d'arrière-plan.

Le système ne peut avoir qu'une fenêtre active de niveau supérieur à la fois, le système activera la fenêtre de niveau supérieur si vous travaillez sur une fenêtre enfant. Toutes les entrées sont ensuite dirigées vers la fenêtre active, puis normalement transmises à la fenêtre enfant.

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

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

De MSDN

Fenêtre active

Une fenêtre active est la fenêtre de niveau supérieur de l'application avec laquelle l'utilisateur travaille actuellement. Pour permettre à l'utilisateur d'identifier facilement la fenêtre active, le système la place en haut de l'ordre z et modifie la couleur de sa barre de titre et de sa bordure en fonction des couleurs de fenêtre actives définies par le système. Seule une fenêtre de niveau supérieur peut être une fenêtre active. Lorsque l'utilisateur travaille avec une fenêtre enfant, le système active la fenêtre parent de niveau supérieur associée à la fenêtre enfant.

premier plan/arrière-plan

Chaque processus peut avoir de multiples fils d'exécution, et chaque fil peut créer des fenêtres. Le thread qui a créé la fenêtre avec laquelle l'utilisateur travaille actuellement s'appelle le thread de premier plan et la fenêtre est appelée la fenêtre de premier plan. Tous les autres threads sont des threads d'arrière-plan et les fenêtres créées par les threads d'arrière-plan sont appelées fenêtres d'arrière-plan.

+0

Microsoft a dit que, une fenêtre de premier plan (appartenant thread de premier plan) est donné plus de priorité. Dans votre troisième cas, ACTIVE WINDOW a-t-il reçu le même privilège? – pinichi

+0

Description msdn de la fenêtre active: * Une fenêtre active est la fenêtre de niveau supérieur de l'application avec laquelle l'utilisateur travaille actuellement. Pour permettre à l'utilisateur d'identifier facilement la fenêtre active, le système la place en haut de l'ordre z et modifie la couleur de sa barre de titre et de sa bordure en fonction des couleurs de fenêtre actives définies par le système. Seule une fenêtre de niveau supérieur peut être une fenêtre active. Lorsque l'utilisateur travaille avec une fenêtre enfant, le système active la fenêtre parent de niveau supérieur associée à la fenêtre enfant. * Est-il possible d'avoir le 3ème cas ci-dessus? – JavaMan

+2

Oui, c'est possible. Une fenêtre Alway On Top (a WS_EX_TOPMOST) peut chevaucher une fenêtre active (flou de la barre de titre, sélectionnez le texte ne pas hightling, curseur de texte ... si) – pinichi