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\" "