LINQ  -  Exibindo todas as aplicações instaladas (VB.NET/C#)


Neste artigo vou usar o LINQ para exibir todas as aplicações instaladas em um computador local.

Para saber mais sobre o LINQ veja a Seção LINQ  do Site.

Vamos usar o namespace Microsoft.Win32 em nossa aplicação sendo que este namespace fornece dois tipos de classes: as classes que tratam os eventos disparados pelo sistema operacional e as classes que manipulam o registro do sistema.

Nosso objetivo é percorrer uma coleção de objetos RegistryKey dentro de "LocalMachine\SOFTWARE\Microsoft\WindowsCurrentVersion\Uninstall" para recuperar todos os aplicativos instalados na máquina Windows.

A classe RegistryKey representa uma chave a nível de nó no registro do Windows. Esta classe é um encapsulamento de registro.

Criando o projeto no Visual C#

Eu vou usar o Visual C# 2010 Express Edition e criar um projeto do tipo WIndows Forms Application com o nome ListandoAplicacoesInstaladas;

A seguir no formulário form1.cs vamos declarar o namespace usado:

using System;

using System.Linq;

using System.Windows.Forms;

using Microsoft.Win32;

No formulário form1.cs inclua um controle ListBox (lstbAplicacoes) , um controle Button (btnExibir) e um controle Label(lblmsg) conforme o leiaute abaixo:

Após a declaração da classe formulário form1.cs defina a variável regkey conforme o código abaixo:

string regkey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";

A seguir no evento Click do botão de comando btnExibir inclua o seguinte código:

private void btnExibir_Click(object sender, EventArgs e)
        {
            lstbAplicacoes.Items.Clear();
            int contador = 0;

            using (RegistryKey key = Registry.LocalMachine.OpenSubKey(regkey))
            {
                var query = from a in
                                 key.GetSubKeyNames()
                                 let r = key.OpenSubKey(a)
                                 select new
                                 {
                                     Application = r.GetValue("DisplayName")
                                 };
                foreach (var item in query)
                {
                    if (item.Application != null)
                        lstbAplicacoes.Items.Add(item.Application);
                    contador++;
                }
            }
            lblmsg.Text = contador + " Aplicações instaladas ";
        }

A classe Registry fornece os Registrykeys base que acessam os valores e subchaves no registro.

Essa classe fornece o conjunto das chaves-raiz padrão encontradas no registro em máquinas usando o Windows. O registro é uma local de armazenamento de informações sobre os aplicativos, usuários e configurações do sistema padrão.

Por exemplo, os aplicativos podem usar o Registro para armazenar informações que precisam ser preservadas uma vez que o aplicativo é fechado, e acessar a essa informação quando o aplicativo for recarregado. Por exemplo, você pode armazenar as preferências de cores, locais de tela, ou o tamanho da janela. Você pode controlar isso para cada usuário, armazenando as informações em um local diferente no registro.

O campo LocalMachine contém os dados de configuração da máquina local. Este campo lê a chave base de registro do Windows HKEY_LOCAL_MACHINE.

O método OpenSubKey recupera uma subchave especificada e determina se o acesso de escrita é para ser aplicado à chave.

A consulta LINQ usada é a seguinte:

var query = from a in  key.GetSubKeyNames()
                  let r = key.OpenSubKey(a)
                  select new
                  {
                        Application = r.GetValue("DisplayName")
                  };
Dim query = From a In key.GetSubKeyNames()
                   Let r = key.OpenSubKey(a) _
                   Select New With _
                   {
                       .Application = r.GetValue("DisplayName")
                   }
C# VB .NET

Estamos usando a cláusula let para armazenar um valor.

Em uma expressão de consulta, as vezes é útil armazenar o resultado de uma sub-expressão a fim de utilizá-la em seções subsequentes.

Você pode fazer isso com a palavra-chave let, a qual cria uma nova variável de intervalo e a inicializa com o resultado da expressão que você fornece.

Uma vez inicializado com um valor, o variável de intervalo não pode ser usada para armazenar um outro valor. No entanto, se a variável de intervalo tem um tipo queryable, ela pode ser consultada. É isso que é feito com a variável r. (
r.GetValue("DisplayName")

Executando o projeto iremos obter:

A versão para VB .NET feita no Visual Basic 2010 Express Edition e usando os mesmos controles com os mesmos nomes é dado a seguir:

Imports Microsoft.Win32
Public Class Form1
    Dim regkey As String = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
    Private Sub btnExibir_Click(sender As System.Object, e As System.EventArgs) Handles btnExibir.Click
        lstbAplicacoes.Items.Clear()
        Dim contador As Integer = 0

        Using key As RegistryKey = Registry.LocalMachine.OpenSubKey(regkey)
            Dim query = From a In key.GetSubKeyNames()
                               Let r = key.OpenSubKey(a) _
                               Select New With _
                               {
                                    .Application = r.GetValue("DisplayName")
                               }
            For Each item In query
                If item.Application IsNot Nothing Then
                    lstbAplicacoes.Items.Add(item.Application)
                End If
                contador += 1
            Next
        End Using
        lblmsg.Text = contador & " Aplicações instaladas "
    End Sub
End Class
Versão VB.NET do projeto

Pegue o projeto completo aqui : ListandoAplicacoesInstaladas_C#.zip   e ListandoAplicacoesInstaladas_VB.zip

Salmos 5:9 Porque não há fidelidade na boca deles; as suas entranhas são verdadeiras maldades, a sua garganta é um sepulcro aberto; lisonjeiam com a sua língua.
Salmos 5:10
Declara-os culpados, ó Deus; que caiam por seus próprios conselhos; lança-os fora por causa da multidão de suas transgressões, pois se revoltaram contra ti.


Veja os Destaques e novidades do SUPER CD VB 2012 (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super CD .NET e no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C# 2012 com exclusivo material de suporte e vídeo aulas com curso básico sobre C#
 


José Carlos Macoratti