[Ayuda]Agregar iconos en la barra de tareas con VB.Net

Iniciado por TMarmol, 8 Octubre 2014, 23:30 PM

0 Miembros y 1 Visitante están viendo este tema.

TMarmol

Hola a todos, estoy haciendo un pequeño programa para automatizar la tarea de agregar los accesos directos a la barra de tareas, pero no consigo averiguar como administrar la barra con VB.Net, he estado buscando si era una clave del registro o algo pero no consigo encontrar nada. si alguien es tan amable de ayudarme le estaré agradecido

Eleкtro

#1
Si usas WPF, según he leido tienes acceso a las JumpLists (y no se si también a la PinList) desde las classes de las librerías WindowsBase y otra que no recuerdo ya.

Para WinForms:
Si tu intención es anclar el executable a la barra de tareas entonces puedes utilizar el siguiente código que he escrito, el cual he tomado la idea de esta otra página, debo decir que no me parece nada eficiente la solucion propuesta y las modificaciones que he echo en mi código, ya que invoca un verbo (comando) y este no es de lenguaje neutro, pero al parecer tras un poco más de investigación no parece haber nada más eficiente ya que estas acciones son elecciones orientadas al usuario, no a la aplicación, no al programador, dejo una cita que me hizo gracia xD:

CitarThe pin list is for users to put their favorite icons. It is not the place for a program to decide unilaterally, "I am so cool. I am your favorite icon. I just know it. So I'll put myself there because, well, I'm so cool."

En fin, ejemplo de uso:
Código (vbnet) [Seleccionar]
ItemPinner(Process.GetCurrentProcess.MainModule.FileName, PinState.PinToTaskBar)

Source:
Código (vbnet) [Seleccionar]
   ' ItemPinner
   ' ( By Elektro )
   '
   ' Instructions:
   ' 1. Add a reference to 'Microsoft Shell Controls And Automation'
   '
   ' Usage Examples:
   ' ItemPinner("C:\Application.exe", PinState.PinToTaskBar)

   ''' <summary>
   ''' Specifies the Pin state for an Item.
   ''' </summary>
   Public Enum PinState As Integer

       ''' <summary>
       ''' Pins an Item onto TaskBar.
       ''' </summary>
       PinToTaskBar = 0I

       ''' <summary>
       ''' Unpins an Item from TaskBar.
       ''' </summary>
       UnpinFromTaskBar = 1I

       ''' <summary>
       ''' Pins an Item onto Start Menu.
       ''' </summary>
       PinToStartMenu = 2I

   End Enum

   ''' <summary>
   ''' Pins or unpins an item onto TaskBar or StartMenu.
   ''' A pinned item in the StartMenu can't be unpinned.
   ''' </summary>
   ''' <param name="filePath">The file path.</param>
   ''' <param name="pinState">State of the pin.</param>
   Public Shared Sub ItemPinner(ByVal filePath As String, ByVal pinState As PinState)

       ' Localized verb names to pin an item onto TaskBar.
       Dim pinTaskbarVerbs As String() =
           {
               "pin to taskbar",
               "anclar a la barra de tareas"
           }

       ' Localized verb names to unpin an item from TaskBar.
       Dim unpinTaskbarVerbs As String() =
           {
               "unpin from taskbar",
               "desanclar de la barra de tareas"
           }

       ' Localized verb names to pin an item onto StartMenu.
       Dim pinStartMenuVerbs As String() =
           {
               "pin to start menu",
               "anclar a inicio"
           }

       ' ShellApplication Class Instance.
       Dim shell As New Shell

       ' Gets the item to check for its pin/unpin verb and invoke it later.
       Dim link As FolderItem = shell.[NameSpace](Path.GetDirectoryName(filePath)).
                                      ParseName(Path.GetFileName(filePath))

       ' The item-verb to invoke.
       Dim verb As FolderItemVerb = Nothing

       Select Case pinState

           Case pinState.PinToTaskBar
               verb = (From ItemVerb As Object In link.Verbs
                       Where pinTaskbarVerbs.Contains(DirectCast(ItemVerb, FolderItemVerb).
                                                      Name.Replace("&"c, String.Empty).ToLower)
                       Select DirectCast(ItemVerb, FolderItemVerb)
                       ).FirstOrDefault

           Case pinState.UnpinFromTaskBar
               verb = (From ItemVerb As Object In link.Verbs
                       Where unpinTaskbarVerbs.Contains(DirectCast(ItemVerb, FolderItemVerb).
                                                        Name.Replace("&"c, String.Empty).ToLower)
                       Select DirectCast(ItemVerb, FolderItemVerb)
                       ).FirstOrDefault

           Case pinState.PinToStartMenu
               verb = (From ItemVerb As Object In link.Verbs
                       Where pinStartMenuVerbs.Contains(DirectCast(ItemVerb, FolderItemVerb).
                                                        Name.Replace("&"c, String.Empty).ToLower)
                       Select DirectCast(ItemVerb, FolderItemVerb)
                       ).FirstOrDefault

           Case Else ' Do Nothing.
               Exit Select

       End Select

       If verb IsNot Nothing Then
           verb.DoIt() ' Invoke the verb.
       End If

   End Sub


Saludos.








TMarmol

Muy Cool la frase xD

Aún no lo he probado por que no he tenido tiempo, cuando pueda lo implementaré a mi programa, pero estando modificado por ti será exactamente lo que busco xD

Eleкtro

#3
Cita de: TMarmol en  9 Octubre 2014, 11:59 AMpero estando modificado por ti será exactamente lo que busco xD

Yo supongo que entendí correctamente lo que quieres, añadir de forma "permanente" tu programa a la barra de tareas, es decir, un anclaje (pin), si quieres añadir jumplists o thumbnails eso ya lo puedes hacer con la librería Windows API Code Pack de Microsoft.

El código funcionará mientras el nombre del verbo/comando sea igual en el SO que lo uses, jeje, yo lo probé en Windows 8.1, no se si en Windows Vista/7 los nombres serán los mismos ("Anclar a la barra de tareas"), pero bueno, si tienes algún problema respecto a eso el código es facilmente editable para añadir más nombes:

Citar
Código (vbnet) [Seleccionar]
      ' Localized verb names to pin an item onto TaskBar.
      Dim pinTaskbarVerbs As String() =
          {
              "pin to taskbar",
              "anclar a la barra de tareas"
          }

Saludos!








TMarmol

Era justo lo que necesitaba, muchas gracias @Elektro , lo de los nombres lo supuse pero no está de mal saberlo