2013-04-26 17 views
5

ho cercato la soluzione in Stack Overflow domande Custom icon for ClickOnce application in 'Add or Remove Programs' e Is there a way to change the icon of a ClickOnce application in 'Add or Remove Programs'?.'Installazione applicazioni' icona di un C# un'applicazione ClickOnce

Quindi, ecco le mie implementazioni. Entrambi vengono compilati e non vengono generate eccezioni quando viene eseguito il codice. Sto pubblicando i file di installazione di ClickOnce su un server web e quindi installandolo dopo la disinstallazione dal computer. Quando vado al pannello di controllo Aggiungi o rimuovi programmi, vedo ancora l'icona generica per il mio programma. Ovunque non ho problemi e la mia icona si presenta bene.

/* METHOD ONE */ 
private static void SetAddRemoveProgramsIcon() 
{ 
    //Only run if deployed 
    if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed && ApplicationDeployment.CurrentDeployment.IsFirstRun) 
    { 
     try 
     { 
      Assembly code = Assembly.GetExecutingAssembly(); 
      AssemblyDescriptionAttribute asdescription = 
       (AssemblyDescriptionAttribute)Attribute.GetCustomAttribute(code, typeof(AssemblyDescriptionAttribute)); 
      string assemblyDescription = asdescription.Description; 

      //The icon is included in this program 
      string iconSourcePath = Path.Combine(System.Windows.Forms.Application.StartupPath, "forico4.ico"); 

      if (!File.Exists(iconSourcePath)) 
       return; 

      RegistryKey myUninstallKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Uninstall"); 
      string[] mySubKeyNames = myUninstallKey.GetSubKeyNames(); 
      for (int i = 0; i < mySubKeyNames.Length; i++) 
      { 
       RegistryKey myKey = myUninstallKey.OpenSubKey(mySubKeyNames[i], true); 
       object myValue = myKey.GetValue("DisplayName"); 
       if (myValue != null && myValue.ToString() == "admin") 
       { 
        myKey.SetValue("DisplayIcon", iconSourcePath); 
        break; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      System.Windows.Forms.MessageBox.Show(ex.Message.ToString()); 
     } 
    } 
} 
*/ 

/* METHOD TWO */ 
private static void SetAddRemoveProgramsIcon() 
{ 
    //only run if deployed 
    if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed 
     && ApplicationDeployment.CurrentDeployment.IsFirstRun) 
    { 
     try 
     { 
      string iconSourcePath = Path.Combine(System.Windows.Forms.Application.StartupPath, "forico4.ico"); 
      if (!File.Exists(iconSourcePath)) 
       return; 

      RegistryKey myUninstallKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Uninstall"); 
      string[] mySubKeyNames = myUninstallKey.GetSubKeyNames(); 
      for (int i = 0; i < mySubKeyNames.Length; i++) 
      { 
       RegistryKey myKey = myUninstallKey.OpenSubKey(mySubKeyNames[i], true); 
       object myValue = myKey.GetValue("DisplayName"); 
       if (myValue != null && myValue.ToString() == "GoldMailAkamai") 
       { 
        myKey.SetValue("DisplayIcon", iconSourcePath); 
        break; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.ToString()); 
     } 
    } 
} 
*/ 

risposta

3

Ho finalmente capito dopo aver esaminato il registro e copiato le impostazioni di altre applicazioni. È strano che non si possa fare riferimento al file EXE in un'applicazione ClickOnce distribuita. Almeno non riuscivo a farlo funzionare. Così, sono tornato a fare riferimento allo .ico invece. Assicurati di leggere i commenti!

using System.Deployment.Application; 
using Microsoft.Win32; 
//Call this method as soon as possible 

private static void SetAddRemoveProgramsIcon() 
{ 
    //Only execute on a first run after first install or after update 
    if (ApplicationDeployment.CurrentDeployment.IsFirstRun) 
    { 
     try 
     { 
      // Set the name of the application EXE file - make sure to include `,0` at the end. 
      // Does not work for ClickOnce applications as far as I could figure out... Note, this will probably work 
      // when run from Visual Studio, but not when deployed. 
      //string iconSourcePath = Path.Combine(System.Windows.Forms.Application.StartupPath, "example.exe,0"); 
      // Reverted to using this instead (note this will probably not work when run from Visual Studio, but will work on deploy. 
      string iconSourcePath = Path.Combine(System.Windows.Forms.Application.StartupPath, "example.ico"); 
      if (!File.Exists(iconSourcePath)) 
      { 
       MessageBox.Show("We could not find the application icon. Please notify your software vendor of this error."); 
       return; 
      } 

      RegistryKey myUninstallKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Uninstall"); 
      string[] mySubKeyNames = myUninstallKey.GetSubKeyNames(); 
      for (int i = 0; i < mySubKeyNames.Length; i++) 
      { 
       RegistryKey myKey = myUninstallKey.OpenSubKey(mySubKeyNames[i], true); 
       object myValue = myKey.GetValue("DisplayName"); 
       Console.WriteLine(myValue.ToString()); 
       // Set this to the display name of the application. If you are not sure, browse to the registry directory and check. 
       if (myValue != null && myValue.ToString() == "Example Application") 
       { 
        myKey.SetValue("DisplayIcon", iconSourcePath); 
        break; 
       } 
      } 
     } 
     catch(Exception mye) 
     { 
      MessageBox.Show("We could not properly setup the application icons. Please notify your software vendor of this error.\r\n" + mye.ToString()); 
     } 
    } 
} 
+0

Perché non possiamo farlo senza l'hacking del registro? – HackSlash

0

Si può semplicemente farlo con il seguente codice.

1

Ho seguito la stessa tecnica utilizzando VB e VS2013E. Passaggi:

  1. Fare clic con il pulsante destro del mouse sul nodo del progetto in Esplora soluzioni.
  2. Aggiungi Exisitng -> Logo.ico
  3. Osservare che il file viene aggiunto all'albero del progetto.
  4. Fare clic con il pulsante destro del mouse su questa voce e selezionare "Proprietà".
  5. "Copia nella directory di output" selezionare "Copia sempre".

I passaggi hanno assicurato che il file Logo.ico sia impacchettato nella distribuzione. I blocchi di codice sono i seguenti:

Imports System.Deployment.Application.ApplicationDeployment 
Imports System.Reflection 
Imports System.IO 
Imports Microsoft.Win32 

Module ControlPanelIcon 
    ' Call this method as soon as possible 
    ' Writes entry to registry 
    Public Function SetAddRemoveProgramsIcon() As Boolean 
     Dim iName As String = "iconFile.ico" ' <---- set this (1) 
     Dim aName As String = "appName" '  <---- set this (2) 
     Try 
      Dim iconSourcePath As String = Path.Combine(System.Windows.Forms.Application.StartupPath, iName) 
      If Not IsNetworkDeployed Then Return False ' ClickOnce check 
      If Not CurrentDeployment.IsFirstRun Then Return False 
      If Not File.Exists(iconSourcePath) Then Return False 
      Dim myUninstallKey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Uninstall") 
      Dim mySubKeyNames As String() = myUninstallKey.GetSubKeyNames() 
      For i As Integer = 0 To mySubKeyNames.Length Step 1 
       Dim myKey As RegistryKey = myUninstallKey.OpenSubKey(mySubKeyNames(i), True) 
       Dim myValue As Object = myKey.GetValue("DisplayName") 
       If (myValue IsNot Nothing And myValue.ToString() = aName) Then 
        myKey.SetValue("DisplayIcon", iconSourcePath) 
        Return True 
       End If 
      Next i 
     Catch ex As Exception 
      Return False 
     End Try 
     Return False 
    End Function 
End Module 

La chiamata di funzione restituisce true se viene eseguita l'azione desiderata. Falso altrimenti. Nella maschera principale, la funzione di chiamata in questo modo:

Sub New() 
    ' This call is required by the Windows Form Designer. 
    InitializeComponent() 
    ' Add any initialization after the InitializeComponent() call. 
    ' Modify registry to show icon in Control Panel - Add/Remove Programs 
    ControlPanelIcon.SetAddRemoveProgramsIcon() 
End Sub 

Grazie ai collaboratori di questo annuncio, e un ringraziamento speciale a Custom icon for ClickOnce application in 'Add or Remove Programs'.

Problemi correlati