2010-03-29 13 views
11

Sto sviluppando un'applicazione chiamata WeatherBar. La sua funzionalità principale è basata sulla sua interazione con la barra delle applicazioni di Windows 7 - cambia l'icona in base alle condizioni meteorologiche in una posizione specifica.modificare a livello l'icona del file eseguibile

Le icone che utilizzo nell'applicazione sono tutte memorizzate in un file di risorse nativo compilato (.res) - Lo sto utilizzando al posto del manifest di risorsa incorporato solo per le icone. Per impostazione predefinita, modifico la proprietà Icon del modulo principale per modificare le icone di conseguenza e funziona correttamente, purché l'icona non sia bloccata sulla barra delle applicazioni. Quando viene bloccato, l'icona nella barra delle applicazioni passa automaticamente a quella predefinita per l'eseguibile (con l'indice 0 nel file di risorse).

Dopo aver fatto un po 'di ricerca, ho pensato che un modo per cambiare l'icona sarebbe cambiare l'icona di collegamento (come tutte le applicazioni bloccate sono in realtà scorciatoie memorizzate nella cartella utente). Ma non ha funzionato.

Suppongo che ho bisogno di cambiare l'icona del file eseguibile, e quindi utilizzare UpdateResource, ma non sono del tutto sicuro di questo. Il mio eseguibile non è firmato digitalmente, quindi non dovrebbe essere un problema che lo modifica.

quale sarebbe il modo per risolvere questo problema?

+1

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

+1

@Vivek Questo non aiuta il problema e non è una soluzione. –

+3

Non è possibile utilizzare UpdateResource, il file .exe è bloccato. Il link di Vivek è tanto buono quanto lo sarà. C'è un buon wrapper nel pacchetto di codice API Window: http://code.msdn.microsoft.com/WindowsAPICodePack –

risposta

3

Se si desidera eseguire questa operazione in modo programmatico, vorrei iniziare osservando lo Portable Executable file format (Wikipedia entry). La sezione delle risorse (.rsrc, vedere la sezione 6.9) dovrebbe contenere l'icona. Usando queste informazioni, puoi scrivere uno strumento per modificare l'icona.

Se si vuole solo cambiare rapidamente un'icona in un file esistente, si potrebbe essere in grado di incidere in su in l'editor di risorse di Visual Studio. Ho provato questo con un file eliminando la vecchia icona e aggiungendone una nuova. L'icona .exe è cambiata in Explorer nella nuova icona e la nuova icona è stata visualizzata nel menu Start quando l'ho trascinata.

- Modifica -

Sì, sono d'accordo che l'uso UpdateResource è un buon approccio. Here is an example Ho trovato di usare le funzioni C++ per farlo e una firma P/Invoke per UpdateResource e FindResource.

+0

Approccio interessante. Anche se c'è un problema - l'Editor delle risorse è un buon strumento e l'ho usato per un po ', ma ho bisogno di cambiare l'icona direttamente nel codice. L'utente finale non sarà in grado di utilizzare l'editor delle risorse per modificare l'icona ogni 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); 
    } 

questo è stato preso da http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/9e23a82c-8bed-4b96-8b9a-4c2b6136a622/

Può essere utile.

+1

Sembra familiare. Non è la soluzione qui. –

+1

Come menzionato da nobugz, questa non è la soluzione. Devo cambiare l'icona nell'eseguibile reale piuttosto che nel collegamento. –

0

Ho deciso di implementare una soluzione alternativa: l'icona cambierà nella miniatura della finestra (è possibile in Windows 7). Se l'icona è sbloccata, l'utente può vedere l'icona cambiare. Nel caso in cui sia bloccato, la miniatura cambierà in base alle condizioni meteorologiche correnti.

Mi sembra come la struttura delle icone bloccate (essendo una scorciatoia, infatti) non consente il cambio di icona dinamica. Se sbaglio, sono aperto a commenti e idee su questo.

Problemi correlati