Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Cambiar iconos del escritorio de Windows (https://www.clubdelphi.com/foros/showthread.php?t=22975)

tiel 02-07-2005 21:28:27

Cambiar iconos del escritorio de Windows
 
Me he estado preguntando... ¿mediante la API es posible cambiar los iconos del escritorio de Windows? Pero más específicamente cambiar los iconos de 'Mi PC', 'Papelera', por otros que yo defina.

Agradecería que alguien me explicara como se lograría esto, he estado 'jugando' con la API, usando el Handle del escritorio manejado como ListView, y usando varias funciones como ListView_SetImageList y ListView_SetItem, pero no he logrado nada, agradecería mucho si alguien me proporcionara información al respecto. :D

dec 02-07-2005 23:15:41

Hola,

En este artículo de CodeCentral se ofrece lo que parece la solución a tu cuita, a lo menos parcialmente. Puede ser un comienzo.

tiel 02-07-2005 23:41:24

Creo que no
 
Ya leí el artículo y más bien te explican como cambiar el icono de una carpeta basado en el Desktop.ini, pero no inidica la manera de cambiar los iconos del escritorio, que es lo que busco.

Gracias.

dec 03-07-2005 00:03:07

Hola,

No solamente lo explican, se puede descargar un ejemplo y funciona, pero, es verdad, no es del todo lo que buscas. Buscando en Google encuentras el modo de cambiar el icono de la papelera de reciclaje, y, si es la única manera de hacerlo (parece haber unanimidad) y hay que hacer lo propio con el icono "Mi PC" (del cual no encontré referencia alguna, bien es verdad que Internet da para más) digo, me parece una chapuza.

Se trata (como podrás comprobar si echas un vistazo a los resultados de Google) de cambiar cierta información del Registro de Windows: en alguna página se dice que va bien en todas las versiones de Windows desde la 95 en adelante: lo cierto es que aquí en Windows XP la clave que hay que utilizar existe, tal como proponen. Es una GUID (¿Global Unique Identifier?) y no sé hasta qué punto querrás meter mano al asunto por ahí.

roman 03-07-2005 03:48:40

Cita:

Empezado por dec
me parece una chapuza.

¿Por qué te parece una chapuza? En algún lugar debe guardarse la información del icono que se va a usar ¿no? ¿Y qué mejor lugar que el registro de Windows?

Para el icono de Mi PC intenten con la clave

{20D04FE0-3AEA-1069-A2D8-08002B30309D}\DefaultIcon

// Saludos

tiel 03-07-2005 04:00:53

OK, ya todo claro
 
Bueno, muchísimas gracias por sus pistas, ya encontré la clave de registro a donde se guardan los settings de los iconos del escritorio, en HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CLSID

Pero ahora tengo otra duda, quisiera saber cómo puedo 'actualizar' el escritorio sin tener que reiniciar la sesión, porque cuando hago los cambios en el registro tengo que reiniciar sesión para ver los iconos cambiados.

Les agradecería mucho si me contestaran esta nueva duda. :confused:

dec 03-07-2005 15:07:50

Hola,

Cita:

Empezado por roman
¿Por qué te parece una chapuza? En algún lugar debe guardarse la información del icono que se va a usar ¿no? ¿Y qué mejor lugar que el registro de Windows?

Pues no sé roman, seguramente no utilizé la palabra adecuada, porque, efectivamente, en algún lugar hay que guardar la información precisa en este caso.

Sin embargo, creo que el uso de GUIDs en este caso se me ha atragantado. No sé, es como si por algún tipo de prejuicio me hubiera dicho "eso no puede funcionar siempre, esa clave será distinta en otro ordenador", pero, ya veo que tal vez esté equivocado.

De todos modos, me sigue pareciendo una chapuza. ;) Quiero decir que si yo quiero encontrar dónde está el Software que tiene instalado el usuario puedo usar la clave "Software" de "HKCU", algo intuitivo, aunque no siempre tan sencillo, pero, ahora resulta que si quiero cambiar el icono del escritorio tengo que buscar la clave "{20D04FE0-3AEA-1069-A2D8-08002B30309D}"...

Y sí, lo cierto es que esa clave existe, esto es, que así habrán de hacerse las cosas, pero, me cierro en banda en este caso: me sigue pareciendo una especie de chapuza (narices, no encuentro la palabra), una cosa, digamos, que podría hacerse de otro modo.

Pero supongo que no será tan sencillo: imagina que en el registro de Windows tuviera que haber claves "con nombres" para todo... realmente la cosa se complicaría y mucho con tanta información: así pues el uso de GUIDs puede ser la solución, en lugar de la chapuza hallada.

A mí, roman, desde luego, no me funciona cambiar ningún dato de la clave que has propuesto para "Mi PC", y, sin embargo, puedo cambiar el texto del icono "Mi PC" desde otra clave, pero solo el texto, no así el icono, el cual se niega a cambiarse.

Por otro lado, habrás visto que en el registro de Windows en más de una y más de dos claves se encuentra un "Mi PC" con subclaves que aparentemente pueden usarse para cambiar el texto, el "hint" y el icono del mencionado elemento... ¿cuál elegir?

Así pues, no digo que sea una chapuza, lo retiro, pero, desde luego, habrán de saberse varias particularidades del registro de Windows en relación con este caso para adentrarse en algo así, como no sea que lo que queramos hacer sea un programa de uso particular, que, al cabo, funcionando en nuestro ordenador pueda valer.

tiel 03-07-2005 19:41:33

Mira
 
Bueno, la verdad es que quizá estás equivocado dec porque si yo modifico el valor de la clave HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\DefaultIcon en el registro de Windows, sí me cambia el icono de 'Mi PC', pero sólo hasta que se reinicia la sesión de mi usuario, tal vez sea cuestión de la versión de Windows que estés usando.

Y ya porfavor dejen de discutir si es una chupaza o lo que sea.

Ahora, lo que me interesa es lograr que se actualizen los iconos del escritorio sin que tenga que reiniciar sesión, alguien me puede decir ¿cómo podría lograr esto?

tiel 03-07-2005 21:10:56

Listo
 
Bueno, respecto al mensaje anterior, ya encontré la manera, lo saqué de una página con un ejemplo en C++ usando la API para simular la tecla 'F5'.

http://www.codeproject.com/system/co...sh_desktop.asp

Y lo implementé de la siguiente manera:

Código:

var
  Desktop_handle: THandle;
  res: Cardinal;
  reg: TRegistry;
  icon_size: String;
begin

  Desktop_handle := FindWindow('Shell_traywnd', nil);

  SendMessage(desktop_handle, WM_SETREDRAW, 0, 0);

  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_CURRENT_USER;
  Reg.OpenKey('Control Panel\Desktop\WindowMetrics', false);
  icon_size := Reg.ReadString('Shell Icon Size');
  Reg.WriteString('Shell Icon Size', IntToStr( StrToInt(icon_size)+1 ) );

  SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE,SPI_SETNONCLIENTMETRICS, 0,SMTO_ABORTIFHUNG, 100000, res);

  Reg.WriteString('Shell Icon Size', icon_size);
  Reg.closekey;
  Reg.Free;

  SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE,SPI_SETNONCLIENTMETRICS, 0,SMTO_ABORTIFHUNG, 100000, res);


  SendMessage(desktop_handle, WM_SETREDRAW, 1, 0);

end;

Muchas gracias a todos ;)


La franja horaria es GMT +2. Ahora son las 19:49:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi