2011-09-01 17 views
15

En VC++, utilizo EnumWindows (...), GetWindow (...) y GetWindowLong(), para obtener la lista de ventanas y verificar si la ventana es superior (no hay otra ventana como propietario), y si la ventana es visible (WS_VISIBLE). Sin embargo, aunque mi escritorio muestra solo 5 ventanas, este EnumWindows me está dando 50 ventanas, ¡qué gracioso! Cualquier geek de Windows aquí, por favor, ayúdame a aclarar ...¿Por qué EnumWindows devuelve más ventanas de las que esperaba?

+1

incluso vi una ventana c alled "start button" – jondinham

+7

Eso es porque el botón de inicio es una ventana. –

Respuesta

27

La manera hacer una lista de sólo ventanas en la barra de tareas (o de manera similar en la caja de Alt-Tab) es descrito por Raymond en este artículo en MSDN blog:
http://blogs.msdn.com/b/oldnewthing/archive/2007/10/08/5351207.aspx

Y esta es la función estupenda para comprobar si una la ventana se muestra en alt-tab:

BOOL IsAltTabWindow(HWND hwnd) 
{ 
    TITLEBARINFO ti; 
    HWND hwndTry, hwndWalk = NULL; 

    if(!IsWindowVisible(hwnd)) 
     return FALSE; 

    hwndTry = GetAncestor(hwnd, GA_ROOTOWNER); 
    while(hwndTry != hwndWalk) 
    { 
     hwndWalk = hwndTry; 
     hwndTry = GetLastActivePopup(hwndWalk); 
     if(IsWindowVisible(hwndTry)) 
      break; 
    } 
    if(hwndWalk != hwnd) 
     return FALSE; 

    // the following removes some task tray programs and "Program Manager" 
    ti.cbSize = sizeof(ti); 
    GetTitleBarInfo(hwnd, &ti); 
    if(ti.rgstate[0] & STATE_SYSTEM_INVISIBLE) 
     return FALSE; 

    // Tool windows should not be displayed either, these do not appear in the 
    // task bar. 
    if(GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) 
     return FALSE; 

    return TRUE; 
} 

Acreditado al código fuente aquí:
http://www.dfcd.net/projects/switcher/switcher.c

+1

¿Alguien sabe por qué esta función no parece considerar los casos de estilo extendido 'WS_EX_TOOLWINDOW' y' WS_EX_APPWINDOW' mencionados por Raymond en su publicación de blog? ¿'STATE_SYSTEM_INVISIBLE' lo cubre o esta función no coincide exactamente con la que describe Raymond? –

+0

@adamsmith toolwindow no es una ventana superior, no se mostrará en la barra de tareas o en el menú alt-tab. porque la ventana principal de la ventana de herramientas no es nula – jondinham

+5

Una mejora adicional es eliminar las ventanas de herramientas de la lista, que tampoco deberían mostrarse. Como se menciona en @DavidHeffernan en la otra respuesta, esto está documentado [en el siguiente artículo de MSDN] (http: //http//msdn.microsoft.com/en-us/library/aa969325.aspx).He mejorado el código anterior con el cheque: 'if (GetWindowLong (hwnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) return FALSE;' –

3

Las ventanas de las que estás hablando, con un botón X y una barra de título, etc. no son el único tipo de ventanas. Botones, menús desplegables, etiquetas, íconos, cuadros de texto, la barra de tareas, y casi todo lo demás también es una ventana . Por lo tanto, EnumWindows está haciendo exactamente lo que se supone que debe hacer: enumerar todas las ventanas de nivel superior.

Aunque esto es cierto, EnumWindows solo enumera las ventanas de nivel superior. Eso significa it won't enumerate any child windows:

La función EnumWindows no enumera las ventanas hijas, con la excepción de unas pocas ventanas de nivel superior de propiedad del sistema que tiene el estilo WS_CHILD.

Sin embargo, muchas cosas en su escritorio también son ventanas, no solo las "ventanas" en las que está pensando.

+0

¿Alguna idea de deshacerse de las llamadas "ventanas" no relacionadas? solo quiero una lista de ventanas visibles (ventanas de aplicaciones, no de diálogo, no botones, etc.) – jondinham

+2

Probablemente desee solo las [ventanas que aparecen en la barra de tareas] (http: // http: //msdn.microsoft.com/en -us/library/aa969325.aspx). "Shell crea un botón en la barra de tareas siempre que una aplicación crea una ventana que no es de su propiedad. Para garantizar que el botón de la ventana se coloque en la barra de tareas, cree una ventana sin propietario con el estilo extendido WS_EX_APPWINDOW. ubicado en la barra de tareas, cree la ventana sin propietario con el estilo extendido WS_EX_TOOLWINDOW. Como alternativa, puede crear una ventana oculta y hacer que esta ventana oculta sea la propietaria de su ventana visible ". –

+0

sí, quiero que aparezca la lista de ventanas en la barra de tareas. Sé cómo esconderme, mostrar una ventana en modo diferente; pero no sé cómo obtener esta lista – jondinham

Cuestiones relacionadas