2010-03-29 4 views
11

Ich entwickle eine Anwendung namens WeatherBar. Die Hauptfunktionalität basiert auf der Interaktion mit der Windows 7-Taskleiste - sie ändert das Symbol abhängig von den Wetterbedingungen an einem bestimmten Ort.Programmatisch das Symbol der ausführbaren Datei ändern

Die Symbole, die ich in der Anwendung verwende, sind alle in einer kompilierten nativen Ressourcendatei (.res) gespeichert - ich benutze es anstelle der eingebetteten Ressource Manifest nur für Symbole. Standardmäßig ändere ich die Icon-Eigenschaft des Hauptformulars, um die Symbole entsprechend zu ändern, und es funktioniert gut, solange das Symbol nicht an die Taskleiste angeheftet ist. Wenn es fixiert wird, wechselt das Symbol in der Taskleiste automatisch zu dem Standard für die ausführbare Datei (mit Index 0 in der Ressourcendatei).

Nach ein wenig Nachforschung dachte ich, dass eine Möglichkeit, das Symbol zu ändern, das Verknüpfungssymbol ändern würde (da alle fixierten Anwendungen tatsächlich Verknüpfungen sind, die im Benutzerordner gespeichert sind). Aber es hat nicht funktioniert.

Ich nehme an, dass ich das Symbol für die ausführbare Datei ändern muss, und daher UpdateResource verwenden, aber ich bin mir nicht ganz sicher darüber. Meine ausführbare Datei ist nicht digital signiert, daher sollte es kein Problem sein, sie zu ändern.

Wie könnte dieses Problem gelöst werden?

+1

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

+1

@Vivek Das hilft nicht das Problem und ist keine Lösung. –

+3

Sie können UpdateResource nicht verwenden, die .exe-Datei ist gesperrt. Viveks Link ist ungefähr so ​​gut, wie er wird. Es gibt einen schönen Wrapper im Window API Code Pack: http://code.msdn.microsoft.com/WindowsAPICodePack –

Antwort

3

Wenn Sie dies programmatisch tun möchten, würde ich mit Blick auf die Portable Executable file format (Wikipedia entry) beginnen. Der Abschnitt Ressourcen (.rsrc, siehe Abschnitt 6.9) sollte das Symbol enthalten. Mit diesen Informationen können Sie ein Werkzeug zum Ändern des Symbols schreiben.

Wenn Sie nur schnell ein Symbol in einer vorhandenen Datei ändern möchten, können Sie es möglicherweise im Visual Studio-Ressourceneditor hacken. Ich habe das mit einer Datei getestet, indem ich das alte Symbol gelöscht und ein neues hinzugefügt habe. Das EXE-Symbol wurde im Explorer auf das neue Symbol geändert, und das neue Symbol wurde im Startmenü angezeigt, als ich es dorthin zog.

- Bearbeiten -

Ja, ich stimme UpdateResource, dass mit einem Ansatz gut ist. Here is an example Ich habe gefunden, C++ - Funktionen zu verwenden, und eine P/Invoke-Signatur für UpdateResource und FindResource.

+0

Interessanter Ansatz. Obwohl es ein Problem gibt - der Resource Editor ist ein gutes Werkzeug und ich habe es eine Weile benutzt, aber ich muss das Icon direkt im Code ändern. Der Endbenutzer kann den Ressourceneditor nicht verwenden, um das Symbol jede Minute zu ändern. –

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); 
    } 

Dies wurde von http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/9e23a82c-8bed-4b96-8b9a-4c2b6136a622/

genommen Es kann helfen.

+1

Sieht vertraut aus. Es ist hier nicht die Lösung. –

+1

Wie nobugz schon erwähnt, ist dies nicht die Lösung. Ich muss das Symbol in der tatsächlichen ausführbaren Datei statt in der Verknüpfung ändern. –

0

Ich entschied mich, eine Problemumgehung zu implementieren - das Symbol ändert sich in der Miniaturansicht für das Fenster (es ist in Windows 7 möglich). Wenn das Symbol nicht fixiert ist, kann der Benutzer das Symbol ändern sehen. Wenn es angeheftet ist, ändert sich das Vorschaubild entsprechend den aktuellen Wetterbedingungen.

Scheint mir wie die Struktur der gepinnten Symbole (eine Abkürzung in der Tat ist) erlaubt keine dynamische Symboländerung. Wenn ich falsch liege, bin ich offen für Kommentare und Ideen dazu.