Ir para o conteúdo

Associar extensões a aplicações

Introdução

O que faz com que o sistema operativo saiba exactamente que aplicação abrir quando tentamos executar um ficheiro não executável? O que faz com que o sistema operativo apresente um ícone diferente para cada diferente tipo de ficheiro? A resposta a estas perguntas é a associação de extensões. O sistema operativo sabe o que fazer, pois esta informação é registada directamente no registo do sistema, local onde esta e muito mais outras informações residem para que tudo possa trabalhar tal e qual como hoje conhecemos.

O que precisamos?

Antes de querermos "ensinar" ao sistema operativo o que fazer a uma determinada extensão deveremos ter em conta um ponto muito importante: estamos a determinar dois caminhos que não são dinâmicos. O ficheiro do ícone e o executável a associar têm de existir exactamente nos mesmos caminhos com que são registados. Visto isto, a melhor altura para registar um executável será na sua instalação ou primeira execução, visto que o executável passa para a sua localização "definitiva" e este deverá fazer acompanhar-se do ícone. De volta à pergunta, apenas precisamos de um executável e de um ícone. Estipulemos para a aplicação C:\Programas\A_Minha_AplicacaoApp.exe e para o ícone C:\Programas\A_Minha_AplicacaoApp.ico. Consideremos a extensão .WIKI como a extensão que queremos associar.

A prática na nossa realidade

Procurar extensões no registo

Este bloco é útil para evitar criar uma associação existente ou remover uma associação inexistente. Trata-se de um método que devolve um boolean para indicar que a extensão existe, ou não.

    Private Function ProcuraExtensao(ByVal Extensao As String) As Boolean

        For Each S As String In My.Computer.Registry.ClassesRoot.GetSubKeyNames
            If UCase(Extensao.Trim) = UCase(Replace(S, ".", "").Trim) Then
                Return True
            End If
        Next

        Return False
    End Function

Registar associação no registo

                Dim CaminhoExe As String = "C:\Programas\A_Minha_Aplicacao\App.exe"
                Dim CaminhoIco As String = "C:\Programas\A_Minha_Aplicacao\App.ico"
                Dim Extensao As String = "WIKI"

                My.Computer.Registry.ClassesRoot.CreateSubKey("." & Extensao).SetValue("", Extensao, Microsoft.Win32.RegistryValueKind.String)
                My.Computer.Registry.ClassesRoot.CreateSubKey(Extensao & "\shell\open\command").SetValue("", CaminhoExe & " ""%l"" ", Microsoft.Win32.RegistryValueKind.String)
                My.Computer.Registry.ClassesRoot.CreateSubKey(Extensao & "\DefaultIcon").SetValue("", CaminhoIco, Microsoft.Win32.RegistryValueKind.ExpandString)

Remover associação no registo

                Dim Extensao As String = "WIKI"

                My.Computer.Registry.ClassesRoot.DeleteSubKey("." & Extensao, False)
                My.Computer.Registry.ClassesRoot.DeleteSubKey(Extensao & "\DefaultIcon", False)
                My.Computer.Registry.ClassesRoot.DeleteSubKey(Extensao & "\shell\open\command", False)
                My.Computer.Registry.ClassesRoot.DeleteSubKey(Extensao & "\shell\open", False)
                My.Computer.Registry.ClassesRoot.DeleteSubKey(Extensao & "\shell", False)
                My.Computer.Registry.ClassesRoot.DeleteSubKey(Extensao, False)

Conclusão

Para efectuar uma associação de extensão com ícone, deveremos adicionar duas chaves em CLASSES_ROOT. Uma que serve como descrição da extensão, e outra para determinar, através de subchaves o ícone a utilizar e a aplicação a chamar.

Também é possível realizar esta associação através de ficheiros do registo (*.REG).s

Bloco para a chave de manifesto

[HKEY_CLASSES_ROOT\.WIKI]
@="WIKI"

Bloco para as chaves de acções

[HKEY_CLASSES_ROOT\WIKI]

[HKEY_CLASSES_ROOT\WIKI\DefaultIcon]
@=hex(2):43,00,3a,00,5c,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,61,00,73,\
  00,5c,00,41,00,5f,00,4d,00,69,00,6e,00,68,00,61,00,5f,00,41,00,70,00,6c,00,\
  69,00,63,00,61,00,63,00,61,00,6f,00,5c,00,41,00,70,00,70,00,2e,00,69,00,63,\
  00,6f,00,00,00

[HKEY_CLASSES_ROOT\WIKI\shell]

[HKEY_CLASSES_ROOT\WIKI\shell\open]

[HKEY_CLASSES_ROOT\WIKI\shell\open\command]
@="C:\\Programas\\A_Minha_Aplicacao\\App.Exe \"%l\" "