Dudas con manipulacion de iconos del escritorio(GuiListViev)
Publicado: 02 May 2017, 01:49
Hey, Iorana!
Vengo con un par de dudas quiza un tanto específicas, que si bien no se si alguien por aqui sepa o me quiera hechar una mano, pero... como dicen por ahi, uno no pierde nada haciendo el intento
.
Hace tiempo que tengo metido en la cabeza hacer cierto "experimentillo": Usar el escritorio de Windows y su sistema de iconos como las viejas consolas de videojuegos (donde los iconos se utilizarían para dibujar cosas en pantalla, las cuales se pueden mover/animar libremente y en conjunto se pueden usar para mostrar en pantalla elementos interesantes ). Parte de la culpa y la inspiracion lo tienen ciertos otros experimentos provenientes de la demoscene.
Investigando y viendo las posiblidades que tenía para hacer aquello, descubrí como se componía el escritorio de Windows para así descubrir que éste utiliza una GuiListView (el componente que se usa para listar y mostrar iconos de archivos y carpetas, tal como el explorador de archivos o vista previas de ciertas GUI's); y que mejor: AutoIT tiene un UDF dedicado para la manipulacion de GuiListView's :). Con tal UDF se pueden crear iconos dummy (recuerden, en realidad no hay archivos extras, solo estamos haciendo iconos sin funcionalidad, modificando la parte GUI del escritorio) y mostrarlos con el nombre, icono y comportamiento a eleccion del usuario. Hechando un poco a perder y tras codificar unas demostraciones llegue a un primer resultado: En sistemas operativos viejos (digase Windows XP para atrás (si, probé en un Windows 95 y funciona xD) )
![Imagen](http://i.imgur.com/wZeWU5k.png)
Pero no en Windows 7/8.x/10! Okay, puedo vivir sin eso aunque igual si te interesa ver de que trata deje un thread en los foros de habla inglesa (aunque hasta el momento de escribir ninguna respuesta ha recibidoLINK ). Por ahora estoy experimentando con Windows XP asi que no hay problema con aquello.
Siguiendo con los experimentos, otro problema crucial es con el cambio de los iconos. Por default puedo cambiar los iconos a los actualmente cargados en la GuiListView (que por lo que veo en los resultados, seria como algo así como una cache de iconos mas usados que genera Windows). Según el UDF de GuiListView, todo GuiListView tiene asociado un GUIImageList, que vendria siendo una lista de imagenes para ser usadas por distintos elementos GUI de Windows (tales como, por supuesto, el escritorio), donde se guardarian dichos iconos recientemente mencionados. El proximo paso sería obvio, manipular tales iconos para mostrar los que se me den la gana
,pero a la hora de ponerlo a la practica, todo sale mal.
Si trato de obtener el GuiListView del escritorio, y el GUIImageList de este...
... hasta ahora ningun problema, obtengo un handle con que me permitiría trabajar éste con el UDF. No obstante, según autoIT, este GUIImageList viene vacío, sin imagenes (iconos), lo que no tiene mucho sentido, pues se demostró ya que tiene cargado todos esos iconos que se ven mas arriba en la imagen. Ademas, si insisto y ejecuto esto para obtener algo de metadata de la imagen #1 del GUIImageList, supuestamente existente...
...Obtengo esto...
Algo asi como una estructura vacía, eh? Como sea! Podria agregar un icono nuevo! Retorna -1 y setea @error. Entonces me quedaria crear un nuevo GUIImageList y setearselo al escritorio, ¿los resultados? Todos los iconos del escritorio desaparecen y se corruptan para "siempre". Bueno, para siempre no, se puede solucionar siguiendo tales pasos para resolver un problema bastante conocido en Windows llamado "El cache de iconos de Windows esta dañado" o "Los iconos del escritorio se muestran incorrectamente".
Lo se lo se! Me estoy metiendo en aguas turbias y poco exploradas, pero mientras mas me sumerjo es mas interesante. Pero sinceramente tengo que decir que aqui me he estancado. Venia a buscar alguien por aqui que alguna vez haya tenido experiencia en manipular cosas extrañas de windows para su conveniencia u otros a ver si se les ocurren algunas ideas nuevas (o hacer algun paso tonto que a mi no se me haya ocurrido). O bien tambien, si creen que existe alguna otra forma 10000 veces mas practica (o no), puedes comentarla tambien. Mas que ayuda, seria bueno algo de cooperacion (o intento de, tampoco me pondre triste si se espantan por este post jaja).
Alguina idea con aquello? Alguien que se ilumine el cielo con alguna idea nueva? O quieres trabajar en conjunto por esto para diversion (lo dudo, hay familias que alimentar jaja).
Para terminar otro video de los avances que he tenido con esta cosilla.
Cualquier cosa me dicen.
Maururu... chaos!
--
PD: Me sorprende en gran medida que la ultima vez que haya entrado por aqui fue hace 8 años ya (para resolver cierta duda jeje).
Vengo con un par de dudas quiza un tanto específicas, que si bien no se si alguien por aqui sepa o me quiera hechar una mano, pero... como dicen por ahi, uno no pierde nada haciendo el intento
![:smt003](./images/smilies/003.gif)
Hace tiempo que tengo metido en la cabeza hacer cierto "experimentillo": Usar el escritorio de Windows y su sistema de iconos como las viejas consolas de videojuegos (donde los iconos se utilizarían para dibujar cosas en pantalla, las cuales se pueden mover/animar libremente y en conjunto se pueden usar para mostrar en pantalla elementos interesantes ). Parte de la culpa y la inspiracion lo tienen ciertos otros experimentos provenientes de la demoscene.
Investigando y viendo las posiblidades que tenía para hacer aquello, descubrí como se componía el escritorio de Windows para así descubrir que éste utiliza una GuiListView (el componente que se usa para listar y mostrar iconos de archivos y carpetas, tal como el explorador de archivos o vista previas de ciertas GUI's); y que mejor: AutoIT tiene un UDF dedicado para la manipulacion de GuiListView's :). Con tal UDF se pueden crear iconos dummy (recuerden, en realidad no hay archivos extras, solo estamos haciendo iconos sin funcionalidad, modificando la parte GUI del escritorio) y mostrarlos con el nombre, icono y comportamiento a eleccion del usuario. Hechando un poco a perder y tras codificar unas demostraciones llegue a un primer resultado: En sistemas operativos viejos (digase Windows XP para atrás (si, probé en un Windows 95 y funciona xD) )
![Imagen](http://i.imgur.com/wZeWU5k.png)
Pero no en Windows 7/8.x/10! Okay, puedo vivir sin eso aunque igual si te interesa ver de que trata deje un thread en los foros de habla inglesa (aunque hasta el momento de escribir ninguna respuesta ha recibidoLINK ). Por ahora estoy experimentando con Windows XP asi que no hay problema con aquello.
Siguiendo con los experimentos, otro problema crucial es con el cambio de los iconos. Por default puedo cambiar los iconos a los actualmente cargados en la GuiListView (que por lo que veo en los resultados, seria como algo así como una cache de iconos mas usados que genera Windows). Según el UDF de GuiListView, todo GuiListView tiene asociado un GUIImageList, que vendria siendo una lista de imagenes para ser usadas por distintos elementos GUI de Windows (tales como, por supuesto, el escritorio), donde se guardarian dichos iconos recientemente mencionados. El proximo paso sería obvio, manipular tales iconos para mostrar los que se me den la gana
![:smt001](./images/smilies/001.gif)
Si trato de obtener el GuiListView del escritorio, y el GUIImageList de este...
Código: Seleccionar todo
$_desktop_hwnd= ControlGetHandle("Program Manager", "", "[CLASS:SysListView32; INSTANCE:1]")
$imageList = _GUICtrlListView_GetImageList ( $_desktop_hwnd, 0 )
Código: Seleccionar todo
$tInfo = _GUIImageList_GetImageInfoEx($imageList, 1)
Código: Seleccionar todo
Image handle .: 0x00000000
Mask handle ..: 0x00000000
Image Left ...: 0
Image Top ....: 0
Image Right ..: 0
Image Bottom .: 0
Lo se lo se! Me estoy metiendo en aguas turbias y poco exploradas, pero mientras mas me sumerjo es mas interesante. Pero sinceramente tengo que decir que aqui me he estancado. Venia a buscar alguien por aqui que alguna vez haya tenido experiencia en manipular cosas extrañas de windows para su conveniencia u otros a ver si se les ocurren algunas ideas nuevas (o hacer algun paso tonto que a mi no se me haya ocurrido). O bien tambien, si creen que existe alguna otra forma 10000 veces mas practica (o no), puedes comentarla tambien. Mas que ayuda, seria bueno algo de cooperacion (o intento de, tampoco me pondre triste si se espantan por este post jaja).
Alguina idea con aquello? Alguien que se ilumine el cielo con alguna idea nueva? O quieres trabajar en conjunto por esto para diversion (lo dudo, hay familias que alimentar jaja).
Para terminar otro video de los avances que he tenido con esta cosilla.
Cualquier cosa me dicen.
Maururu... chaos!
--
PD: Me sorprende en gran medida que la ultima vez que haya entrado por aqui fue hace 8 años ya (para resolver cierta duda jeje).