2010-10-15 12 views
28

En Windows, ¿cuál es la diferencia entre el primer plano y la ventana activa? Para ser específico, ¿bajo qué circunstancias una ventana en primer plano puede no ser una ventana activa? Si los 2 términos se refieren al mismo concepto, ¿por qué hay 2 términos?Foreground Vs Ventana activa

la documentación de MSDN aquí menciona "clic en una ventana, o mediante el uso de la ALT +TAB o ALT +ESC combinación de teclas" hace una ventana activa, así como primer plano. No hay nada explícitamente sobre la diferencia entre los 2 términos. Ver MSDN.

Respuesta

37

La ventana activa (el resultado de GetActiveWindow()) es la ventana unido al subproceso de llamada que recibe de entrada. La ventana de primer plano (el resultado de GetForegroundWindow()) es la ventana que está recibiendo entrada actualmente, independientemente de su relación con el hilo de llamada. La ventana activa está esencialmente localizada en su aplicación; la ventana de primer plano es global para el sistema.

Por ejemplo, si una ventana perteneciente a otro proceso es el primer plano, llamar al GetActiveWindow() desde su propio proceso devolverá NULL.

Creo que es cierto que ser la ventana de primer plano implica ser la ventana activa, pero lo contrario no es cierto.También tenga en cuenta que en Windows moderno, las aplicaciones generalmente no pueden usar SetForegroundWindow() para robar el foco de otro proceso (a menos que ese proceso haya dado explícitamente permiso a través del AllowSetForegroundWindow).

+1

Esta es _la_ respuesta correcta. También es útil leer [esta publicación del blog] (http://blogs.msdn.com/b/oldnewthing/archive/2008/10/06/8969399.aspx). – Ruslan

+0

No es estrictamente cierto que al llamar a 'GetActiveWindow' desde un hilo de fondo devuelve' NULL'. Se puede activar una ventana de subproceso en segundo plano, sin convertirla en la ventana de primer plano (por ejemplo, llamando a 'SetForegroundWindow' sin cumplir los requisitos, o si cambia a otra aplicación entre el inicio de una aplicación y la aplicación que muestra su UI). Sin embargo, tiene casi razón sobre la ventana activa: la ventana activa se virtualiza por ** hilo ** (o grupo de hilos de entrada por entrada), no por aplicación o proceso. – IInspectable

+0

La respuesta anterior que acepté fue editada posteriormente y ahora tiene poco sentido para mí. Entonces, cambié mi respuesta aceptada a esto, después de 5 y 1/2 años !!!!!!!!!!!!!!!!!!!!!! – JavaMan

8

puedo encontrar la descripción en MSDN un poco confuso también, pero aquí está mi revisada:

En primer lugar un primer plano y el fondo de la ventana no tienen nada que ver con las ventanas activas, tiene que ver con el roscado, ver más abajo. Por lo tanto, es técnicamente posible tener una ventana de fondo como una ventana activa; sin embargo, es confusa y el sistema no hace esto por usted; en su lugar, debe llamar a la aplicación, p. SetWindowPos para activar la ventana de fondo.

El sistema solo puede tener una ventana activa de nivel superior a la vez, el sistema activará la ventana de nivel superior si está trabajando en una ventana secundaria. Toda la entrada se dirige a la ventana activa y luego normalmente se pasa a la ventana secundaria.

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

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

De MSDN

ventana activa

una ventana activa es la ventana de nivel superior de la aplicación con la que el usuario está trabajando actualmente. Para permitir que el usuario identifique fácilmente la ventana activa, el sistema la coloca en la parte superior del orden zy cambia el color de la barra de título y el borde de los colores de la ventana activa definida por el sistema. Solo una ventana de nivel superior puede ser una ventana activa. Cuando el usuario está trabajando con una ventana secundaria, el sistema activa la ventana principal de nivel superior asociada con la ventana secundaria.

primer plano/fondo

Cada proceso puede tener múltiples hilos de ejecución, y cada hilo puede crear ventanas. El hilo que creó la ventana con la que el usuario está trabajando actualmente se denomina hilo de primer plano, y la ventana se llama ventana de primer plano. Todos los otros subprocesos son subprocesos de fondo y las ventanas creadas por subprocesos de fondo se llaman ventanas de fondo.

+0

Microsoft dijo que una ventana en primer plano (pertenece a la cadena de caracteres en primer plano) tiene más prioridad. En su 3er caso, ¿VENTANA ACTIVA recibió el mismo privilegio? – pinichi

+0

msdn descripción de Active Window: * Una ventana activa es la ventana de nivel superior de la aplicación con la que el usuario está trabajando actualmente. Para permitir que el usuario identifique fácilmente la ventana activa, el sistema la ubica en ** la parte superior del orden z ** y cambia el color de su barra de título y el borde de los colores de la ventana activa definida por el sistema. Solo una ventana de nivel superior puede ser una ventana activa. Cuando el usuario está trabajando con una ventana secundaria, el sistema activa la ventana principal de nivel superior asociada con la ventana secundaria. * Entonces, ¿es posible tener la tercera caja indicada anteriormente? – JavaMan

+2

Sí, es posible. Una ventana de Alway On Top (tiene WS_EX_TOPMOST) puede superponerse a una ventana activa (desenfoque de la barra de título, seleccionar texto no hightling, cursor de texto ...) – pinichi

Cuestiones relacionadas