A la luz de un recent discussion on Meta quejándose de que cuestiones como ésta "no han sido debidamente contestadas", voy a tratar de dar una respuesta a esta un torbellino. No insinuar que creo que meklarian's answer es malo, de hecho, desde ahí. Pero claramente se ha considerado insatisfactorio, así que tal vez pueda completar algunos de los detalles adicionales.
Su problema es el resultado de una confusión bastante generalizada sobre lo que realmente es la ventana del escritorio. El GetDesktopWindow
function hace precisamente lo que está documentado hacer: devuelve un identificador a la ventana del escritorio. Esto, sin embargo, no es la misma ventana que contiene los iconos de escritorio . Esa es una ventana completamente diferente que apareció por primera vez en Windows 95. En realidad es un control ListView
establecido en la vista "Iconos grandes", con la ventana del escritorio real como su elemento principal.
Raymond Chen, un desarrollador del equipo de Windows Shell ofrece algunos detalles adicionales en el siguiente artículo Confidencial de Windows: Leftovers from Windows 3.0
[. . .] Mientras que en Windows 3.0, los iconos en el escritorio representaban ventanas minimizadas, en Windows 95, el escritorio funcionaba como un contenedor de iconos.
El escritorio de Windows 95 era en realidad una ventana creada por Explorer que cubría su pantalla (pero se encontraba debajo de todas las otras ventanas en su escritorio). Esa fue la ventana que mostró sus iconos. Todavía había una ventana del escritorio del administrador de ventanas debajo (la ventana que aparece si llama a GetDesktopWindow), pero nunca la vio porque estaba cubierta por el escritorio de Windows 95, del mismo modo que los paneles de madera en el sótano de la casa de mi colega cubrió la pared original y la cápsula del tiempo detrás de la pared.
[. . .]
Este diseño de escritorio se ha mantenido prácticamente sin cambios desde su introducción en Windows 95. En una máquina típica, el escritorio original todavía está allí, pero está completamente cubierto por el escritorio Explorer.
En resumen, por tanto, la ventana devuelto por la función GetDesktopWindow
es la ventana del escritorio real, el único que teníamos en el camino de vuelta de Windows 3.0. El escritorio Explorer (el que contiene todos sus iconos) es simplemente otra ventana que se encuentra en la parte superior de la ventana del escritorio (aunque cubre completamente el original) que no se agregó hasta Windows 95.
Si desea obtener un identificador para la ventana del escritorio de Explorer, debe realizar un trabajo adicional más allá de simplemente llamar a la función GetDesktopWindow
. En particular, debe atravesar las ventanas secundarias de la ventana de escritorio actual para encontrar la que Explorer usa para mostrar iconos. Haga esto llamando al FindWindowEx
function para obtener cada ventana en la jerarquía hasta que llegue al que desea. Tiene un nombre de clase de SysListView32
. También es probable que desee utilizar el GetShellWindow
function, que devuelve un identificador a la ventana del escritorio del Shell, para ayudarlo a comenzar.
El código podría tener este aspecto (advertencia: este código no se ha probado, y no recomienda el uso de todos modos):
HWND hShellWnd = GetShellWindow();
HWND hDefView = FindWindowEx(hShellWnd, NULL, _T("SHELLDLL_DefView"), NULL);
HWND folderView = FindWindowEx(hDefView, NULL, _T("SysListView32"), NULL);
return folderView;
me señaló allí que en realidad no recomiendan usando ese código. Por qué no? Debido a en casi todos los casos en los que desea obtener un control para la ventana del escritorio (real ventana de escritorio, o el escritorio Explorer), está haciendo algo mal.
No se debe interactuar así con la ventana del escritorio. De hecho, ¡en realidad no se supone que interactúes con él en absoluto! ¿Recuerdas cómo aprendiste cuando eras un niño que se supone que no debes jugar con cosas que pertenecen a otras personas sin su permiso? Bueno, el escritorio pertenece a Windows (más específicamente, al Shell), ¡y no le ha dado permiso para jugar con sus juguetes! Y como cualquier niño bueno, el Shell está sujeto a lanzar un ataque cuando intenta jugar con sus juguetes sin preguntar.
La misma Raymond Chen ha publicado otro artículo en su blog que detalla un caso muy específico, titulado What's so special about the desktop window?
Más allá del ejemplo que da, esto no es fundamentalmente la manera de hacer la automatización de la interfaz de usuario. Simplemente es demasiado frágil, demasiado problemático y también está sujeto a romper versiones futuras de Windows. En su lugar, defina qué es lo que realmente está tratando de lograr y luego busque la función que le permita hacerlo.
Si tal función no existe, la lección que debe aprenderse no es que Microsoft simplemente quiere hacerles la vida más difícil a los desarrolladores. Pero en primer lugar, se supone que se supone que deben estar haciendo eso en primer lugar.
¿Tal vez podrías editar la pregunta con más información sobre lo que piensas hacer con el mango una vez que lo tienes? –
Tenga en cuenta que los objetos en los escritorios XP/Vista/7 NO son archivos. Por ejemplo, los objetos comunes que se encuentran allí son "Mi PC" y "Papelera de reciclaje". Esos son conocidos por sus PIDL. Un PIDL es una generalización de un nombre de archivo. Probablemente estés interesado en los PIDL seleccionados. – MSalters
Así que si copio un documento, por ejemplo, "Questions.doc" (un documento de Word), necesito obtener el PIDL para eso, o lo obtengo como un archivo. –