domingo, 24 de junio de 2012

Cómo ver si un programa está instalado en nuesta PC

Utilizando el registro de windows se pueden ver todos los programas instalados en nuestra máquina (o cualquier texto que esté en la registry de windows). El código que sigue a continuación se desarrolló para buscar una serie de programas instalados en un cliente.

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;
        }
    }
}

sábado, 23 de junio de 2012

Cómo ejecutar un programa con .NET C#

Con una simple instrucción se puede ejecutar un programa que esté instalado en nuestra pd desde .NET... con C# son un par de líneas:

try
{
 Process.Start(item.Paths);
}
catch (Exception exception)
{
 MessageBox.Show("Se ha producido un error al intentar abrir el programa." + Environment.NewLine + "Mensaje de error: " + exception.Message;);
}
 
Para que esto funcione hay que usar también: using System.Diagnostics;

viernes, 22 de junio de 2012

Cómo sacar un ícono de un .exe o .dll en .NET con C#

Aquí una pequeña función que sirve para sacar el ícono de un archivo (.exe, .dll) en windows en c#.



using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace ProgramasInstalados.Clases
{
    /// <summary>
    /// Clase para extraer iconos de ficheros de recursos.
    /// </summary>
    class Iconos
    {

 ...

 ...

 ...

  
     /// <summary>
     /// Devuelve el icono del programa
     /// </summary>
     /// <param name="path">
     /// La ruta del programa al que se le quiere sacar el ícono 
     /// ej: "c:/prog.exe" </param>
     /// <returns>
     /// Un objeto Icon con el icono o null
     /// </returns>
     public static Icon IconDelPrograma(string path)
     {
          Icon icono = null;
          try
          {
              icono = Icon.ExtractAssociatedIcon(path);
          }
          catch
          { //capturo la excepcion
          }
       return icono;
     }

  

 .........


    }
} 



miércoles, 13 de junio de 2012

Crear calendarios sincronizables en gmail usando outlook para compartir con muchos usuarios


Sincronizar calendarios

Pasos

  1. Ir a Google calendar https://www.google.com/calendar/ e ingresar con el usuario de google.
  2. Crear un nuevo calendario. (Mis calendarios → Crear nuevo calendario)
  3. Agregar las personas que se quiere que vean el calendario y darle los permisos necesarios (deben tener cuentas de gmail)
  4. Click en Crear calendario para crearlo
  5. Ir al calendario, click sobre la flecha que aparece al lado y hacer click en “Compartir calendario”.
  6. Ir a Configuración → Configuración y después a la solapa calendarios donde hacemos click en el calendario que queremos compartir.
  7. Hacer click en el botón ical que aparece abajo en verde y aparecerá un popup que tiene la url para compartir el calendario.
  8. Si se hace click directamente en la url permite abrirla con el outlook y ver el calendario.
  9. Si no se usa esa opción se puede ir al outlook y...
    1. Ir a Herramientas → Configuración de la cuenta.
    2. Elegir la solapa Calendarios e internet
    3. Hacer click en nuevo y se abre un popup para ingresar la url copiada