2010-10-15 15 views
28

Worin besteht in Windows der Unterschied zwischen Vordergrund und aktivem Fenster? Um genau zu sein, unter welchen Umständen kann ein Vordergrundfenster kein aktives Fenster sein? Wenn sich die beiden Begriffe auf dasselbe Konzept beziehen, gibt es zwei Begriffe.Vordergrund Vs Aktives Fenster

die MSDN-Dokumentation hier erwähnt „ein Fenster klicken, oder indem Sie mit dem ALT +TAB oder ALT +ESC Tastenkombination“ macht ein Fenster aktiv sowie Vordergrund. Es gibt nichts explizit über den Unterschied zwischen den 2 Begriffen. Überprüfen Sie MSDN.

Antwort

37

Das aktive Fenster (das Ergebnis von GetActiveWindow()) ist das Fenster , das an den aufrufenden Thread angeschlossen ist, der Eingang erhält. Das Vordergrundfenster (das Ergebnis von GetForegroundWindow()) ist das Fenster, das derzeit unabhängig von seiner Beziehung zu dem aufrufenden Thread eingegeben wird. Das aktive Fenster ist im Wesentlichen für Ihre Anwendung lokalisiert. Das Vordergrundfenster ist global für das System.

Wenn beispielsweise ein Fenster, das zu einem anderen Prozess gehört, der Vordergrund ist, wird der Aufruf GetActiveWindow() in Ihrem eigenen Prozess NULL zurückgeben.

Ich glaube, dass es wahr ist, dass das Vordergrundfenster bedeutet, das aktive Fenster zu sein, aber das Gegenteil ist nicht wahr.Beachten Sie auch, dass Anwendungen in modernen Windows-Umgebungen normalerweise SetForegroundWindow() nicht verwenden können, um den Fokus von einem anderen Prozess zu stehlen (es sei denn, dieser Prozess hat explizit die Berechtigung über AllowSetForegroundWindow erteilt).

+1

Dies ist die richtige Antwort. Auch nützlich zu lesen ist [dieser Blog-Beitrag] (http://blogs.msdn.com/b/oldnewthing/archive/2008/10/06/8969399.aspx). – Ruslan

+0

Es ist nicht streng zutreffend, dass das Aufrufen von 'GetActiveWindow' aus einem Hintergrundthread 'NULL' zurückgibt. Das Fenster eines Hintergrundthreads kann aktiviert werden, ohne es zum Vordergrundfenster zu machen (z. B. durch Aufrufen von 'SetForegroundWindow', ohne die Anforderungen zu erfüllen, oder wenn Sie zwischen dem Start einer Anwendung und der Anwendung, die die Benutzeroberfläche anzeigt, zu einer anderen Anwendung wechseln). Mit dem aktiven Fenster haben Sie jedoch fast Recht: Das aktive Fenster wird per ** thread ** (oder input-attached thread group) virtualisiert, nicht pro Anwendung oder Prozess. – IInspectable

+0

Die vorherige Antwort, die ich angenommen habe, wurde später bearbeitet und ergibt für mich jetzt wenig Sinn. Also, ich habe meine akzeptierte Antwort geändert, nach 5 und 1/2 Jahren !!!!!!!!!!!!!!!!!!!!!! – JavaMan

8

Ich finde die Beschreibung in MSDN ein bisschen auch verwirrend, aber hier mein überarbeitet nehmen ist:

Zuerst ein Vordergrund- und Hintergrundfenster nichts mit aktiven Fenstern zu tun, es hat mit einem Gewinde zu tun, siehe unten. Daher ist es technisch möglich, ein Hintergrundfenster als aktives Fenster zu verwenden, es ist jedoch verwirrend und das System tut dies nicht für Sie, stattdessen muss Ihre App z. SetWindowPos, um das Hintergrundfenster aktiv zu machen.

Das System kann immer nur ein aktives Fenster der obersten Ebene haben, das System aktiviert das Fenster der obersten Ebene, wenn Sie an einem untergeordneten Fenster arbeiten. Alle Eingaben werden dann in das aktive Fenster geleitet und dann normalerweise an das untergeordnete Fenster übergeben.

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

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

Von MSDN

aktives Fenster

Ein aktives Fenster ist das Fenster der obersten Ebene der Anwendung, mit der der Benutzer gerade arbeitet. Damit der Benutzer das aktive Fenster leicht identifizieren kann, platziert das System es an der Spitze der Z-Reihenfolge und ändert die Farbe seiner Titelleiste und seines Rahmens in die systemdefinierten aktiven Fensterfarben. Nur ein Fenster der obersten Ebene kann ein aktives Fenster sein. Wenn der Benutzer mit einem untergeordneten Fenster arbeitet, aktiviert das System das übergeordnete Fenster der obersten Ebene, das dem untergeordneten Fenster zugeordnet ist.

Vordergrund/Hintergrund

Jeder Prozess kann mehrere Ausführungs-Threads haben, und jeder Thread Fenster zu schaffen. Der Thread, der das Fenster erstellt hat, mit dem der Benutzer gerade arbeitet, wird als Vordergrund-Thread bezeichnet, und das Fenster wird als Vordergrundfenster bezeichnet. Alle anderen Threads sind Hintergrundthreads und die von Hintergrundthreads erzeugten Fenster werden als Hintergrundfenster bezeichnet.

+0

Microsoft sagte, dass ein Vordergrundfenster (gehören Vordergrund Thread) hat mehr Priorität gegeben. In Ihrem dritten Fall erhielt AKTIVES FENSTER dasselbe Privileg? – pinichi

+0

msdns Beschreibung von Active Window: * Ein aktives Fenster ist das Fenster der obersten Ebene der Anwendung, mit der der Benutzer gerade arbeitet. Damit der Benutzer das aktive Fenster leicht identifizieren kann, platziert das System es an der Spitze der Z-Reihenfolge ** und ändert die Farbe seiner Titelleiste und seines Rands in die systemdefinierten aktiven Fensterfarben. Nur ein Fenster der obersten Ebene kann ein aktives Fenster sein. Wenn der Benutzer mit einem untergeordneten Fenster arbeitet, aktiviert das System das übergeordnete Hauptfenster, das dem untergeordneten Fenster zugeordnet ist. * So ist es möglich, den oben genannten dritten Fall zu haben? – JavaMan

+2

Ja, das ist möglich. Ein Alway On Top-Fenster (hat WS_EX_TOPMOST) kann ein aktives Fenster überlappen (Titelleiste blur, Text nicht highling, Textcursor ... though) – pinichi

Verwandte Themen