2010-03-29 20 views
11

Estoy desarrollando una aplicación llamada WeatherBar. Su funcionalidad principal se basa en su interacción con la barra de tareas de Windows 7: cambia el ícono dependiendo de las condiciones climáticas en una ubicación específica.Programmatically change the icon of the executable

Los íconos que estoy usando en la aplicación están todos almacenados en un archivo de recursos nativos compilado (.res) - Lo estoy usando en lugar del manifiesto de recursos incrustado solo para iconos. De forma predeterminada, modifico la propiedad Icon del formulario principal para cambiar los iconos en consecuencia y funciona bien, siempre que el icono no esté fijado a la barra de tareas. Cuando se fija, el icono en la barra de tareas cambia automáticamente al predeterminado para el ejecutable (con índice 0 en el archivo de recursos).

Después de investigar un poco, pensé que una forma de cambiar el ícono sería cambiar el ícono de acceso directo (ya que todas las aplicaciones fijadas son en realidad accesos directos almacenados en la carpeta del usuario). Pero no funcionó.

Supongo que tengo que cambiar el icono para el ejecutable, y por lo tanto uso UpdateResource, pero no estoy del todo seguro de esto. Mi ejecutable no está firmado digitalmente, por lo que no debería ser un problema modificarlo.

¿Cuál sería la forma de resolver este problema?

+1

http://stackoverflow.com/questions/969033/change-pinned-taskbar-icon-windows-7 – Vivek

+1

@Vivek Eso no ayuda al problema y no es una solución. –

+3

No puede usar UpdateResource, el archivo .exe está bloqueado. El enlace de Vivek es tan bueno como lo que va a obtener. Hay un buen contenedor en el paquete de código API de Windows: http://code.msdn.microsoft.com/WindowsAPICodePack –

Respuesta

3

Si desea hacer esto programáticamente, comenzaría por mirar el Portable Executable file format (Wikipedia entry). La sección de recursos (.rsrc, consulte la sección 6.9) debe contener el ícono. Usando esta información, puede escribir una herramienta para modificar el ícono.

Si solo desea cambiar rápidamente un icono en un archivo existente, es posible que pueda hackearlo en el editor de recursos de Visual Studio. Probé esto con un archivo al eliminar el icono anterior y agregar uno nuevo. El ícono .exe cambió en Explorer al nuevo ícono, y el ícono nuevo apareció en el menú Inicio cuando lo arrastré hasta allí.

- Editar -

Sí, estoy de acuerdo que el uso de UpdateResource es un buen enfoque. Here is an example Encontré el uso de funciones C++ para hacerlo, y una firma P/Invoke para UpdateResource y FindResource.

+0

Interesante enfoque. Aunque hay un problema, el Editor de recursos es una buena herramienta y la utilicé por un tiempo, pero necesito cambiar el icono directamente en el código. El usuario final no podrá usar el editor de recursos para cambiar el ícono cada minuto. –

0
private void button1_Click(object sender, EventArgs e) 
    { 
     String path = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); 
     String name = "test"; 
     Shell32.Shell shl = new Shell32.ShellClass(); 
     // Optional code to create the shortcut 
     System.IO.StreamWriter sw = new System.IO.StreamWriter(path + @"\" + name + ".lnk", false); 
     sw.Close(); 
     // End optional code 
     Shell32.Folder dir = shl.NameSpace(path); 
     Shell32.FolderItem itm = dir.Items().Item(name + ".lnk"); 
     Shell32.ShellLinkObject lnk = (Shell32.ShellLinkObject)itm.GetLink; 
     // Optional code to create the shortcut 
     lnk.Path = Environment.GetFolderPath(Environment.SpecialFolder.System) 
+ @"\notepad.exe"; 
     lnk.Description = "nobugz was here"; 
     lnk.Arguments = @"c:\sample.txt"; 
     lnk.WorkingDirectory = @"c:\"; 
     // End optional code 
     lnk.SetIconLocation(Environment.GetFolderPath(Environment.SpecialFolder.System) 
+ "cmd.exe", 1); 
     lnk.Save(null); 
    } 

Esto fue tomado de http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/9e23a82c-8bed-4b96-8b9a-4c2b6136a622/

Puede ser de ayuda.

+1

Parece familiar. No es la solución aquí. –

+1

Como mencionó Nobugz, esta no es la solución. Necesito cambiar el icono en el ejecutable real en lugar de hacerlo en el acceso directo. –

0

Decidí implementar una solución: el icono cambiará en la miniatura de la ventana (es posible en Windows 7). Si el ícono no está fijado, el usuario puede ver cómo cambia el ícono. En caso de que esté inmovilizado, la miniatura cambiará de acuerdo con las condiciones climáticas actuales.

Me parece que la estructura de los iconos fijados (al ser un atajo, de hecho) no permite el cambio dinámico de iconos. Si estoy equivocado, estoy abierto a comentarios e ideas sobre esto.