2009-11-03 13 views
12

API de Windows proporciona una API GetDesktopWindow() que devuelve la ventana de manejar¿Cómo obtengo el identificador de ventana del escritorio?

Pero probado con Spy ++ y me parece que el identificador de ventana del escritorio y el identificador de ventana de la "Escritorio de Windows" no es lo mismo.

Como el "Escritorio de Windows" es una vista de lista, qué tengo que hacer lo siguiente

1) HANDLE hWnd = GetDesktopWindow() ; 
2) FindWindow(hWnd, .....) with the SyslistView32 as the Window class. 

Una vez que tengo el identificador de ventana, quiero usar SendMessage() para operaciones como conseguir nombre del archivo seleccionado , la cantidad de archivos seleccionados, etc.

Por favor dé sus puntos de vista. Estoy haciendo esto usando la SDK de Windows

+0

¿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? –

+0

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

+0

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. –

Respuesta

7

Si desea la ventana del Escritorio como se define en GetDesktopWindow(), use ese identificador de ventana. Este es el identificador de ventana que debe usar para buscar ventanas de nivel superior y otras actividades relacionadas.

Lo que está viendo en Spy ++ es simplemente el contenido dibujado como el escritorio en su sesión. Si usa la ubicación automática en Spy ++, verá que la ventana declarada SysListView32 es una ventana secundaria de su shell de explorador. Es bastante infrecuente que alguien necesite acceder a esta ventana. Además, la existencia de esta ventana puede estar sujeta a cambios entre las versiones de Windows.

Editar (información adicional)

Si usted está buscando para interactuar o lugar cosas en el escritorio de shell real, que puede ser mejor servido por otras API. Aquí hay dos de tales API que pueden lograr esto, dependiendo de la versión de destino de Windows.

Windows Sidebar @ MSDN
Este servicio está disponible en Vista y Windows 7

Using the Active Desktop @ MSDN
Este servicio está disponible en Windows 2000 y XP, aunque con frecuencia desactivado por los usuarios y administradores de sistemas.

+1

Pero Spy ++ también devuelve el identificador de la ventana, y el manejador reencuadrado por Spy ++ y GetDesktopWindow es diferente –

15

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.

+0

Gracias por el comentario y los enlaces. Esto no tiene nada que ver con la automatización de UI. Debo diferir con la afirmación "se supone que no debes hacer eso en primer lugar": de hecho, iterar a través de ventanas y, a veces, de plomería COM, es la forma ** única ** de llegar a las ventanas. –

+0

@Sujay: Ese comentario se pierde por completo. No se * supone * para llegar a estas ventanas. Me gustó robar juguetes de otras personas cuando no te dieron permiso para jugar con ellos. Esto no tiene nada que ver con COM; se trata del escritorio de Windows, propiedad de Shell. –

+0

"No debe llegar a estas ventanas". Mi trabajo requiere que use esas ventanas. Para usar esas ventanas es básico, también puede ingresar a los procesos: http://en.wikipedia.org/wiki/DLL_injection :-), y hay varios programas que lo hacen . (No estoy hablando solamente de virus) .. LOL –

Cuestiones relacionadas