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?
Respuesta
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
¿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? –
@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
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;' –
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.
¿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
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 ". –
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
- 1. ¿Es significativo el orden en que las manijas son devueltas por EnumWindows?
- 2. ¿Cómo saber cuándo EnumWindows finaliza su listado de ventanas?
- 3. ¿Cómo puedo enumerar las ventanas abiertas (~ EnumWindows) de otra sesión de usuario?
- 4. Cuando resta direcciones de memoria, ¿por qué el resultado es más pequeño de lo que esperaba?
- 5. ¿Por qué el tamaño de mi sindicato es más grande de lo que esperaba?
- 6. ¿Por qué este clon de git superficial es más grande de lo que esperaba?
- 7. Delphi XE2 EnumWindows no funciona correctamente
- 8. ¿Qué son estas ventanas? .. "M" y "IME predeterminado" (de GetWindowText)
- 9. C más lento que Java: ¿por qué?
- 10. ¿Por qué document.GetElementById devuelve nulo
- 11. ¿Por qué es más lento que contiene?
- 12. ¿Por qué no se aplica Colspan como se esperaba?
- 13. ¿Por qué las aplicaciones de red basadas en eventos son inherentemente más rápidas que las enrutadas?
- 14. ¿Algún algoritmo eficiente para encontrar las ventanas pangramáticas más pequeñas?
- 15. ¿Por qué son tan altas las lecturas lógicas para las funciones agregadas en ventanas?
- 16. ¿Por qué este código XS que devuelve PerlIO * tiene fugas?
- 17. ¿Por qué SelectSingleNode devuelve nulo?
- 18. por qué Files.probeContentType devuelve nulo
- 19. ¿Por qué BitmapFactory.decodeByteArray devuelve nulo?
- 20. ¿Por qué sys.getrefcount() devuelve 2?
- 21. ¿Por qué ISNUMERIC ('.') Devuelve 1?
- 22. ¿Por qué este script de MSBuild no establece la propiedad de la manera que yo esperaba?
- 23. ¿Por qué chrome.extension.getBackgroundPage() devuelve nulo?
- 24. ¿Por qué is_array() devuelve falso?
- 25. ¿Por qué Bitmap.getConfig() devuelve nulo?
- 26. ¿Por qué mi función recursiva devuelve None?
- 27. ¿Por qué navigator.appCodeName devuelve Mozilla?
- 28. ¿Por qué IndexOf devuelve -1?
- 29. ¿Por qué GetCurrentProcess devuelve -1?
- 30. ¿Por qué ostream_iterator no funciona como se esperaba?
incluso vi una ventana c alled "start button" – jondinham
Eso es porque el botón de inicio es una ventana. –