El llamado al método de búsqueda es algo del estilo:
reg.buscarEnLaRegistry(Registry.LocalMachine.OpenSubKey(@"SOFTWARE"), busqueda);
Siendo busqueda:
private List<RegistroWindows.itemBuscar> busqueda;
Y siendo reg
RegistroWindows reg = new RegistroWindows();
Como notarán uso Registry.LocalMachine.OpenSubKey(@"SOFTWARE") solo buscando en el nodo SOFTWARE de la registry ya que allí se encuentra el soft instalado.
using System;
using System.Collections.Generic;
using Microsoft.Win32;
namespace ProgramasInstalados.Clases
{
/// <summary>
/// Clase para trabajar con el registro de windows
/// </summary>
public class RegistroWindows
{
/// <summary>
/// Item a buscar
/// </summary>
public class itemBuscar
{
/// <summary>
/// Nombre del item o texto a buscar
/// </summary>
public string Nombre { get; set; }
public bool Encontrado { get; set; }
public string Paths { get; set; }
public itemBuscar(string nombre)
{
Nombre = nombre;
Encontrado = false;
Paths = "";
}
}
/// <summary>
/// Busca un texto en la registry
/// </summary>
/// <param name="registryKey">Clave del registro donde se realiza la busqueda (y en sus nodos hijo)</param>
/// <param name="buscar">Lista de items a buscar del tipo itemBuscar</param>
public void buscarEnLaRegistry(RegistryKey registryKey, List<itemBuscar> buscar)
{
foreach (string keyName in registryKey.GetSubKeyNames())// me fijo si esta en alguna clave de este nivel
{
if (!ignorar(keyName))// solo veo las claves que no estan en la lista de ignorar
{
try
{
using (RegistryKey rk = registryKey.OpenSubKey(keyName))
{
foreach (string valueName in rk.GetValueNames())
{
foreach (itemBuscar item in buscar)
{
string path = "";
if ((path = rk.GetValue(valueName).ToString()).ToLower().EndsWith(item.Nombre.ToLower()))// me fijo si tiene el .exe que estoy buscando
{// si no esta NO lo seteo en false porque podria haberlo encontrado antes
item.Encontrado = true;
if (!item.Paths.Contains(path))// me fijo que ya no este cargado
{
item.Paths += path;
}
}
}
}
buscarEnLaRegistry(rk, buscar);// me fijo si esta en alguno de sus hijos
}
}
catch (Exception)
{
}
}
}
}
/// <summary>
/// Verifica si keyName esta en la lista de ignorar (en los settings, sitting Excluir separado por comas)
/// </summary>
/// <param name="keyName">el string a buscar para ver si se debe ignorar</param>
/// <returns>true si se debe ignorar, sino false</returns>
private bool ignorar(string keyName)
{
foreach (string ignorar in ProgramasInstalados.Properties.Settings.Default.Excluir.Split(','))
{
// En settings guardo en un string separado por comas los nodos en los que no quiero
// que se busque dentro de la registry; ya que por ejemplo el nodo Microsoft tiene
// todos los programas que instalo Microsoft, tambien se puede evitar el nodo Windows
// ya que tiene los programas propios de windows, entre otros. Esto hace que sea mas
// rapida la busqueda dentro de la registry, ya que recorrerla completa si no es
// necesario insumiria bastante tiempo.
if (ignorar == keyName)
{
return true;
}
}
return false;
}
}
}