el Guille, la Web del Visual Basic, C#, .NET y más...

Mostrar los programas en inicio (run) y los procesos activos

Publicado el 02/Ene/2006
Actualizado el 02/Ene/2006
Autor: Guillermo 'guille' Som

Utilidad para mostrar los programas en inicio (run) y los procesos activos, permitiendo detener los que están en funcionamiento y eliminarlos del inicio.



 

Esta es una utilidad que como indica el título sirve para mostrar todas las aplicaciones que se inician con nuestra sesión, tanto las que están en el registro (run) como en la carpeta de inicio.
Además muestra todos los programas o procesos que están actualmente funcionando.

El porqué de esta utilidad, que se remonta al año 2003, fue la de facilitar a un colega para que detectara fácilmente los programas "intrusos", vamos los que se le colaban de continuo, y como por esas fechas los conocimientos que tenía sobre cómo manejar el registro y esas cosas no eran muy fuertes, pues... en fin de ahí surgió la idea... y la otra noche me preguntó nuevamente por esta utilidad, con idea de pasársela a otro colega, que tenía esos mismos problemillas, así que... me he decidido a mejorarla un poco, más bien el aspecto de la interfaz, de forma que ahora tenga un splitter que permita cambiar el tamaño de las dos zonas en que se divide el formulario y también he añadido el path de los procesos que están en ejecución, con idea de que sea más fácilmente localizable el programa (o proceso) que se "cuele" en el equipo.

Como extra, esta utilidad permite detener un proceso además de poder eliminar del inicio los programas que queramos.

También tiene un par de botones para refrescar tanto los procesos que están ejecutándose actualmente y los programas que están en inicio.

 

Esta es una captura de la utilidad en ejecución:



Figura 1. La aplicación en funcionamiento

 

Para acceder a la información de los programas que están en inicio se comprueban las siguientes entradas del registro de Windows, en las que están tanto los programas que se inician directamente porque están en las claves del registro o bien porque están en el menú Inicio:

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
  • HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Run
  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
    • Common Startup
    • Startup
       

Para acceder a esas claves del registro utilizo un objeto del tipo RegistryKey

 

Más abajo tienes el código fuente tanto para VB como para C#, a excepción del código del diseñador del formulario.

También tienes los links para bajarte tanto el código fuente como el ejecutable, en ambos ficheros se incluye el checksum de MD5, para que compruebes que son los originales.

 

¡Que lo disfrutes!

Nos vemos.
Guillermo

 


 

Código para Visual Basic.NET (VB.NET)El código para VB .NET

Este es el código de VB, solo falta el código del diseñador del formulario, (así te entretienes)

'------------------------------------------------------------------------------
' Procesos en Inicio
' Lista los procesos en ejecución y los que se inician con Windows
'
' Última revisión (2003) para VS.NET 2002                           (01/Mar/03)
' Última revisión (2004) para VS.NET 2003                           (06/Mar/04)
' Revisado con algunas mejoras                                      (02/Ene/06)
'   Añado Splitter y el directorio del ejecutable
'
' ©Guillermo 'guille' Som, 2003-2006
'------------------------------------------------------------------------------

Imports Microsoft.Win32
Imports System.IO

Public Class fProcesosInicio
    Inherits System.Windows.Forms.Form
    '
    Private ColorOscuro As System.Drawing.Color = Color.FromKnownColor(KnownColor.ControlDark)
    Private ColorClaro As System.Drawing.Color = Color.FromKnownColor(KnownColor.ControlLightLight)
    Private nombreEquipo As String = "."
    '
    Public Sub New()
        MyBase.New()

        Application.EnableVisualStyles()
        Application.DoEvents()

        'El Diseñador de Windows Forms requiere esta llamada.
        InitializeComponent()

        'Agregar cualquier inicialización después de la llamada a InitializeComponent()
        linea1.Left = 2
        linea1.Width = Me.ClientSize.Width - 4
        linea1.BackColor = ColorOscuro
        linea1.Height = 1
        linea2.Size = linea1.Size
        linea2.BackColor = ColorClaro
        linea2.Height = 1
        linea2.Top = linea1.Top + 1
        linea2.SendToBack()
        '
        ' posicionarla arriba en el centro
        Me.Top = -4
        Me.Left = (Screen.PrimaryScreen.WorkingArea.Width - Me.Width) \ 2
        '
    End Sub
    '
#Region " Código generado por el Diseñador de Windows Forms "


#End Region
    '
    Private Sub Form_Load(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) _
                          Handles MyBase.Load
        '
        With Me.lvEnEjecucion
            .View = View.Details
            .FullRowSelect = True
            .CheckBoxes = False
            .GridLines = True
            .LabelEdit = False
            .Columns.Clear()
            .Columns.Add("Proceso", 120, HorizontalAlignment.Left)
            .Columns.Add("Hora inicio", 128, HorizontalAlignment.Right)
            .Columns.Add("Directorio", 300, HorizontalAlignment.Left)
            .Items.Clear()
        End With
        With lvEnInicio
            .View = View.Details
            .FullRowSelect = True
            .CheckBoxes = False
            .GridLines = True
            .LabelEdit = False
            .Columns.Clear()
            .Columns.Add("Nombre", 160, HorizontalAlignment.Left)
            .Columns.Add("Ejecutable", 400, HorizontalAlignment.Left)
            .Columns.Add("Clave del registro", 480, HorizontalAlignment.Left)
            .Items.Clear()
        End With
        '
        lblInfo.Text = "©Guillermo 'guille' Som, 2003"
        If DateTime.Now.Year > 2006 Then
            lblInfo.Text &= "-" & DateTime.Now.Year.ToString
        Else
            lblInfo.Text &= "-2006"
        End If
        '
        ' mostrar los programas en el inicio de las claves del registro
        mostrarEnInicio()
        '
        ' mostrar los procesos activos
        Me.btnActualizar_Click(btnActualizar, System.EventArgs.Empty)
        '
    End Sub
    '
    Private Sub btnCerrar_Click(ByVal sender As Object, _
                                ByVal e As System.EventArgs) _
                                Handles btnCerrar.Click
        Me.Close()
    End Sub
    '
    Private Sub btnDetener_Click(ByVal sender As Object, _
                                 ByVal e As System.EventArgs) _
                                 Handles btnDetener.Click
        ' detener el argumento seleccionado de la lista
        Dim prog As String
        '
        If lvEnEjecucion.SelectedItems.Count = 0 Then Exit Sub
        '
        Try
            prog = lvEnEjecucion.SelectedItems(0).Text
            If MessageBox.Show("¿Quieres cerrar el programa: " & prog & "?", "Cerrar proceso", _
				MessageBoxButtons.YesNo, MessageBoxIcon.Question, _
				MessageBoxDefaultButton.Button2) = DialogResult.No Then
                Exit Sub
            End If
        Catch 'ex As Exception
            Exit Sub
        End Try
        '
        Try
            Dim procesos() As Process = Process.GetProcessesByName(prog)
            procesos(0).CloseMainWindow()
            If procesos(0).HasExited = False Then
                procesos(0).Kill()
                procesos(0).Close()
            End If
            '
            btnActualizar_Click(btnActualizar, e)
        Catch ex As Exception
            lblInfo.Text = " Error al detener el proceso: " & ex.Message
            MessageBox.Show("Error al detener el proceso:" & vbCrLf & ex.Message)
        End Try
    End Sub
    '
    Private Sub btnActualizar_Click(ByVal sender As Object, _
                                    ByVal e As System.EventArgs) _
                                    Handles btnActualizar.Click
        '
        Me.Cursor = Cursors.WaitCursor
        Me.Refresh()
        '
        lvEnEjecucion.Items.Clear()
        '
        ' actualizar la lista con los procesos activos
        Dim procesos() As Process = Process.GetProcesses(nombreEquipo)
        '
        Dim proceso As Process
        For Each proceso In procesos
            Dim lvItem As ListViewItem = lvEnEjecucion.Items.Add(proceso.ProcessName)
            Try
                Try
                    lvItem.SubItems.Add(proceso.StartTime.ToString("dd/MM/yyyy HH:mm:ss"))
                Catch
                    lvItem.SubItems.Add(" ")
                End Try
                ' Añado el directorio del proceso                   (02/Ene/06)
                Try
                    lvItem.SubItems.Add(proceso.MainModule.FileName)
                Catch
                    lvItem.SubItems.Add(" ")
                End Try
            Catch ex As Exception
                lvItem.Text = "<Error>"
                lvItem.SubItems.Add(" ")
            End Try
        Next
        '
        lvEnEjecucion.Sorting = SortOrder.Descending '= SortOrder.Ascending
        lvEnEjecucion.Sort()
        '
        Me.Cursor = Cursors.Default
        '
    End Sub
    '
    Private Sub btnEliminar_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles btnEliminar.Click
        ' Eliminar del registro la entrada seleccionada
        ' si la subclave 1 y 2 del listview es la misma, será un fichero
        If Me.lvEnInicio.SelectedItems.Count > 0 Then
            Dim lvItem As ListViewItem = Me.lvEnInicio.SelectedItems(0)
            Dim s As String
            '
            If lvItem.SubItems(1).Text = lvItem.SubItems(2).Text Then
                s = lvItem.SubItems(1).Text
                If MessageBox.Show("¿Quieres borrar el fichero:" & vbCrLf & _
                                    s & "?", "Eliminar clave del registro", _
                                    MessageBoxButtons.YesNo, MessageBoxIcon.Question, _
				    MessageBoxDefaultButton.Button2 _
                                    ) = DialogResult.Yes Then
                  Try
                      File.Delete(s)
                      mostrarEnInicio()
                  Catch ex As Exception
                        MessageBox.Show(Me, "Error: " & ex.Message, "Error al eliminar un programa", _
					MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    End Try
                End If
            Else
                s = lvItem.SubItems(2).Text & "\" & lvItem.Text
                If MessageBox.Show("¿Quieres borrar el valor del registro:" & vbCrLf & _
                                    s & "?", "Eliminar clave del registro", _
                                    MessageBoxButtons.YesNo, MessageBoxIcon.Question, _
				    MessageBoxDefaultButton.Button2 _
                                    ) = DialogResult.Yes Then
                    Try
                        Dim regKey As RegistryKey
                        '
                        If s.StartsWith("HKEY_LOCAL_MACHINE\") Then
                            regKey = Registry.LocalMachine.OpenSubKey( _
					"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", True)
                        ElseIf s.StartsWith("HKEY_USERS\") Then
                            regKey = Registry.Users.OpenSubKey( _
					".DEFAULT\Software\Microsoft\Windows\CurrentVersion\Run", True)
                        ElseIf s.StartsWith("HKEY_CURRENT_USER\") Then
                            regKey = Registry.CurrentUser.OpenSubKey( _
					"Software\Microsoft\Windows\CurrentVersion\Run", True)
                        End If
                        regKey.DeleteValue(lvItem.Text)
                        regKey.Close()
                        mostrarEnInicio()
                    Catch ex As Exception
                        MessageBox.Show(Me, "Error: " & ex.Message, _
					"Error al eliminar un programa del registro", _
					MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                    End Try
                End If
            End If
        End If
    End Sub
    '
    Private Sub mostrarEnInicio()
        Dim s As String
        Dim regKey As RegistryKey
        '
        lvEnInicio.Items.Clear()
        '
        ' leer los programas de la clave:
        ' HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
        regKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run")
        For Each s In regKey.GetValueNames
            With lvEnInicio.Items.Add(s)
                .SubItems.Add(regKey.GetValue(s).ToString)
                .SubItems.Add(regKey.Name)
            End With
        Next
        regKey.Close()
        '
        ' HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Run
        regKey = Registry.Users.OpenSubKey(".DEFAULT\Software\Microsoft\Windows\CurrentVersion\Run")
        For Each s In regKey.GetValueNames
            With lvEnInicio.Items.Add(s)
                .SubItems.Add(regKey.GetValue(s).ToString)
                .SubItems.Add(regKey.Name)
            End With
        Next
        regKey.Close()
        '
        ' HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
        regKey = Registry.CurrentUser.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run")
        For Each s In regKey.GetValueNames
            With lvEnInicio.Items.Add(s)
                .SubItems.Add(regKey.GetValue(s).ToString)
                .SubItems.Add(regKey.Name)
            End With
        Next
        regKey.Close()
        '
        ' mostrar los programas en el menú de inicio de todos los usuarios
        ' HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
        regKey = Registry.LocalMachine.OpenSubKey( _
			"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders")
        s = regKey.GetValue("Common Startup").ToString
        '
        Dim dirInicio As New DirectoryInfo(s)
        Dim ficInfo As FileInfo
        For Each ficInfo In dirInicio.GetFiles
            s = ficInfo.FullName
            ' para no mostrar los ocultos
            'If (ficInfo.Attributes And FileAttributes.Hidden) <> FileAttributes.Hidden Then
            If s.IndexOf("desktop.ini") = -1 Then
                With lvEnInicio.Items.Add(Path.GetFileNameWithoutExtension(s))
                    .SubItems.Add(s)
                    .SubItems.Add(s)
                End With
            End If
        Next
        regKey.Close()
        '
        ' mostrar los programas en el menú de inicio del usuario actual
        regKey = Registry.CurrentUser.OpenSubKey( _
			"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders")
        s = regKey.GetValue("Startup").ToString
        dirInicio = New DirectoryInfo(s)
        For Each ficInfo In dirInicio.GetFiles
            s = ficInfo.FullName
            If s.IndexOf("desktop.ini") = -1 Then
                With lvEnInicio.Items.Add(Path.GetFileNameWithoutExtension(s))
                    .SubItems.Add(s)
                    .SubItems.Add(s)
                End With
            End If
        Next
        regKey.Close()
        '
    End Sub
    '
    Private Sub lvEnInicio_ColumnClick(ByVal sender As Object, _
                                       ByVal e As System.Windows.Forms.ColumnClickEventArgs) _
                                       Handles lvEnInicio.ColumnClick
        If lvEnInicio.Sorting = SortOrder.Ascending Then
            lvEnInicio.Sorting = SortOrder.Descending
        Else
            lvEnInicio.Sorting = SortOrder.Ascending
        End If
        lvEnInicio.Sort()
    End Sub
    '
    Private Sub lvEnEjecucion_ColumnClick(ByVal sender As Object, _
                                          ByVal e As System.Windows.Forms.ColumnClickEventArgs) _
                                          Handles lvEnEjecucion.ColumnClick
        If lvEnEjecucion.Sorting = SortOrder.Ascending Then
            lvEnEjecucion.Sorting = SortOrder.Descending
        Else
            lvEnEjecucion.Sorting = SortOrder.Ascending
        End If
        lvEnEjecucion.Sort()
    End Sub

    Private Sub btnRefrescarInicio_Click(ByVal sender As System.Object, _
				ByVal e As System.EventArgs) Handles btnRefrescarInicio.Click
        mostrarEnInicio()
    End Sub
End Class

 


Código para C Sharp (C#)El código para C#

Código de la aplicación en C#, (sin el código del formulario)

//-----------------------------------------------------------------------------
// Procesos en Inicio
// Lista los procesos en ejecución y los que se inician con Windows
//
// Última revisión (2003) para VS.NET 2002                          (01/Mar/03)
// Última revisión (2004) para VS.NET 2003                          (06/Mar/04)
// Revisado con algunas mejoras                                     (02/Ene/06)
//   Añado Splitter y el directorio del ejecutable
//
// ©Guillermo 'guille' Som, 2003-2006
//-----------------------------------------------------------------------------
 
using System;
using System.Drawing;
using System.Windows.Forms;

using System.Diagnostics;

using Microsoft.Win32;
using System.IO;
 
public class fProcesosInicio : System.Windows.Forms.Form
{
    [STAThread]
    static void Main() 
    {
        Application.Run(new fProcesosInicio());
    }
    //
    private System.Drawing.Color ColorOscuro = Color.FromKnownColor(KnownColor.ControlDark);
    private System.Drawing.Color ColorClaro = Color.FromKnownColor(KnownColor.ControlLightLight);
    private string nombreEquipo = ".";
    //
    public fProcesosInicio() : base() 
    {
 
        Application.EnableVisualStyles();
        Application.DoEvents();
 
        //El Diseñador de Windows Forms requiere esta llamada.
        InitializeComponent();

        base.Load += new System.EventHandler(Form_Load);
        btnCerrar.Click += new System.EventHandler(btnCerrar_Click);
        btnDetener.Click += new System.EventHandler(btnDetener_Click);
        btnActualizar.Click += new System.EventHandler(btnActualizar_Click);
        btnEliminar.Click += new System.EventHandler(btnEliminar_Click);
        lvEnInicio.ColumnClick += 
			new System.Windows.Forms.ColumnClickEventHandler(lvEnInicio_ColumnClick);
        lvEnEjecucion.ColumnClick += 
			new System.Windows.Forms.ColumnClickEventHandler(lvEnEjecucion_ColumnClick);
        btnRefrescarInicio.Click += new System.EventHandler(btnRefrescarInicio_Click);
 
        //Agregar cualquier inicialización después de la llamada a InitializeComponent()
        linea1.Left = 2;
        linea1.Width = this.ClientSize.Width - 4;
        linea1.BackColor = ColorOscuro;
        linea1.Height = 1;
        linea2.Size = linea1.Size;
        linea2.BackColor = ColorClaro;
        linea2.Height = 1;
        linea2.Top = linea1.Top + 1;
        linea2.SendToBack();
        //
        // posicionarla arriba en el centro
        this.Top = -4;
        this.Left = (Screen.PrimaryScreen.WorkingArea.Width - this.Width) / 2;
        //
    }  
    //
    #region " Código generado por el Diseñador de Windows Forms "
 
 
    #endregion
    //
    private void Form_Load(System.Object sender, System.EventArgs e) 
    {
        //
        this.lvEnEjecucion.View = View.Details;
        this.lvEnEjecucion.FullRowSelect = true;
        this.lvEnEjecucion.CheckBoxes = false;
        this.lvEnEjecucion.GridLines = true;
        this.lvEnEjecucion.LabelEdit = false;
        this.lvEnEjecucion.Columns.Clear();
        this.lvEnEjecucion.Columns.Add("Proceso", 120, HorizontalAlignment.Left);
        this.lvEnEjecucion.Columns.Add("Hora inicio", 128, HorizontalAlignment.Right);
        this.lvEnEjecucion.Columns.Add("Directorio", 300, HorizontalAlignment.Left);
        this.lvEnEjecucion.Items.Clear();
        lvEnInicio.View = View.Details;
        lvEnInicio.FullRowSelect = true;
        lvEnInicio.CheckBoxes = false;
        lvEnInicio.GridLines = true;
        lvEnInicio.LabelEdit = false;
        lvEnInicio.Columns.Clear();
        lvEnInicio.Columns.Add("Nombre", 160, HorizontalAlignment.Left);
        lvEnInicio.Columns.Add("Ejecutable", 400, HorizontalAlignment.Left);
        lvEnInicio.Columns.Add("Clave del registro", 480, HorizontalAlignment.Left);
        lvEnInicio.Items.Clear();
        //
        lblInfo.Text = "©Guillermo 'guille' Som, 2003";
        if( DateTime.Now.Year > 2006 )
        {
            lblInfo.Text += "-" + DateTime.Now.Year.ToString();
        }
        else
        {
            lblInfo.Text += "-2006";
        }
        //
        // mostrar los programas en el inicio de las claves del registro
        mostrarEnInicio();
        //
        // mostrar los procesos activos
        this.btnActualizar_Click(btnActualizar, System.EventArgs.Empty);
        //
    }  
    //
    private void btnCerrar_Click(object sender, System.EventArgs e) 
    {
        this.Close();
    }  
    //
    private void btnDetener_Click(object sender, System.EventArgs e) 
    {
        // detener el argumento seleccionado de la lista
        string prog;
        //
        if( lvEnEjecucion.SelectedItems.Count == 0 ) return;
        //
        try
        {
            prog = lvEnEjecucion.SelectedItems[0].Text;
            if( MessageBox.Show("¿Quieres cerrar el programa: " + prog + "?", 
				"Cerrar proceso", MessageBoxButtons.YesNo, 
				MessageBoxIcon.Question, MessageBoxDefaultButton.Button2 
				) == DialogResult.No )
            {
                return;
            }
        }
        catch
        { //ex As Exception
            return;
        }
        //
        try
        {
            Process[] procesos = Process.GetProcessesByName(prog);
            procesos[0].CloseMainWindow();
            if( procesos[0].HasExited == false )
            {
                procesos[0].Kill();
                procesos[0].Close();
            }
            //
            btnActualizar_Click(btnActualizar, e);
        }
        catch(Exception ex)
        {
            lblInfo.Text = " Error al detener el proceso: " + ex.Message;
            MessageBox.Show("Error al detener el proceso:" + "\r\n" + ex.Message);
        }
    }  
    //
    private void btnActualizar_Click(object sender, System.EventArgs e) 
    {
        //
        this.Cursor = Cursors.WaitCursor;
        this.Refresh();
        //
        lvEnEjecucion.Items.Clear();
        //
        // actualizar la lista con los procesos activos
        Process[] procesos = Process.GetProcesses(nombreEquipo);
        //
        foreach(Process proceso in procesos)
        {
            ListViewItem lvItem = lvEnEjecucion.Items.Add(proceso.ProcessName);
            try
            {
                try
                {
                    lvItem.SubItems.Add(proceso.StartTime.ToString("dd/MM/yyyy HH:mm:ss"));
                }
                catch
                {
                    lvItem.SubItems.Add(" ");
                }
                // Añado el directorio del proceso                   (02/Ene/06)
                try
                {
                    lvItem.SubItems.Add(proceso.MainModule.FileName);
                }
                catch
                {
                    lvItem.SubItems.Add(" ");
                }
            }
            catch
            {
                lvItem.Text = "<Error>";
                lvItem.SubItems.Add(" ");
            }
        }
        //
        lvEnEjecucion.Sorting = SortOrder.Descending;
        lvEnEjecucion.Sort();
        //
        this.Cursor = Cursors.Default;
        //
    }  
    //
    private void btnEliminar_Click(System.Object sender, System.EventArgs e) 
    {
        // Eliminar del registro la entrada seleccionada
        // si la subclave 1 y 2 del listview es la misma, será un fichero
        if( this.lvEnInicio.SelectedItems.Count > 0 )
        {
            ListViewItem lvItem = this.lvEnInicio.SelectedItems[0];
            string s;
            //
            if( lvItem.SubItems[1].Text == lvItem.SubItems[2].Text )
            {
                s = lvItem.SubItems[1].Text;
                if( MessageBox.Show("¿Quieres borrar el fichero:" + "\r\n" + s + "?", 
				"Eliminar clave del registro", MessageBoxButtons.YesNo, 
				MessageBoxIcon.Question, MessageBoxDefaultButton.Button2 
				) == DialogResult.Yes )
                {
                    try
                    {
                        File.Delete(s);
                        mostrarEnInicio();
                  }
                    catch(Exception ex)
                    {
                        MessageBox.Show(this, "Error: " + ex.Message, "Error al eliminar un programa", 
					MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                }
            }
            else
            {
                s = lvItem.SubItems[2].Text + @"\" + lvItem.Text;
                if( MessageBox.Show("¿Quieres borrar el valor del registro:\n" + s + "?", 
				"Eliminar clave del registro", MessageBoxButtons.YesNo, 
				MessageBoxIcon.Question, MessageBoxDefaultButton.Button2 
				) == DialogResult.Yes )
                {
                    try
                    {
                        RegistryKey regKey = null;
                        //
                        if( s.StartsWith(@"HKEY_LOCAL_MACHINE\") )
                        {
                            regKey = Registry.LocalMachine.OpenSubKey( 
					@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
                        }
                        else if( s.StartsWith(@"HKEY_USERS\") )
                        {
                            regKey = Registry.Users.OpenSubKey( 
					@".DEFAULT\Software\Microsoft\Windows\CurrentVersion\Run", true);
                        }
                        else if( s.StartsWith(@"HKEY_CURRENT_USER\") )
                        {
                            regKey = Registry.CurrentUser.OpenSubKey( 
					@"Software\Microsoft\Windows\CurrentVersion\Run", true);
                        }
                        regKey.DeleteValue(lvItem.Text);
                        regKey.Close();
                        mostrarEnInicio();
                    }
                    catch(Exception ex)
                    {
                        MessageBox.Show(this, "Error: " + ex.Message, 
					"Error al eliminar un programa del registro", 
					MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                }
            }
        }
    }  
    //
    private void mostrarEnInicio() 
    {
        string s;
        RegistryKey regKey = null;
        //
        lvEnInicio.Items.Clear();
        //
        // leer los programas de la clave:
        // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
        regKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
        foreach(string s1 in regKey.GetValueNames())
        {
            ListViewItem it = lvEnInicio.Items.Add(s1);
            it.SubItems.Add(regKey.GetValue(s1).ToString());
            it.SubItems.Add(regKey.Name);
        }
        regKey.Close();
        //
        // HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Run
        regKey = Registry.Users.OpenSubKey(@".DEFAULT\Software\Microsoft\Windows\CurrentVersion\Run");
        foreach(string s1 in regKey.GetValueNames())
        {
            ListViewItem it = lvEnInicio.Items.Add(s1);
            it.SubItems.Add(regKey.GetValue(s1).ToString());
            it.SubItems.Add(regKey.Name);
        }
        regKey.Close();
        //
        // HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
        regKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run");
        foreach(string s1 in regKey.GetValueNames())
        {
            ListViewItem it = lvEnInicio.Items.Add(s1);
            it.SubItems.Add(regKey.GetValue(s1).ToString());
            it.SubItems.Add(regKey.Name);
        }
        regKey.Close();
        //
        // mostrar los programas en el menú de inicio de todos los usuarios
        // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
        regKey = Registry.LocalMachine.OpenSubKey( 
				@"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders");
        s = regKey.GetValue("Common Startup").ToString();
        //
        DirectoryInfo dirInicio = new DirectoryInfo(s);
        foreach(FileInfo ficInfo in dirInicio.GetFiles())
        {
            s = ficInfo.FullName;
            // para no mostrar los ocultos
            if( s.IndexOf("desktop.ini") == -1 )
            {
                ListViewItem it = lvEnInicio.Items.Add(Path.GetFileNameWithoutExtension(s));
                it.SubItems.Add(s);
                it.SubItems.Add(s);
            }
        }
        regKey.Close();
        //
        // mostrar los programas en el menú de inicio del usuario actual
        regKey = Registry.CurrentUser.OpenSubKey( 
				@"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders");
        s = regKey.GetValue("Startup").ToString();
        dirInicio = new DirectoryInfo(s);
        foreach(FileInfo ficInfo in dirInicio.GetFiles())
        {
            s = ficInfo.FullName;
            if( s.IndexOf("desktop.ini") == -1 )
            {
                ListViewItem it = lvEnInicio.Items.Add(Path.GetFileNameWithoutExtension(s));
                it.SubItems.Add(s);
                it.SubItems.Add(s);
            }
        }
        regKey.Close();
    }  
    //
    private void lvEnInicio_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e) 
    {
        if( lvEnInicio.Sorting == SortOrder.Ascending )
            lvEnInicio.Sorting = SortOrder.Descending;
        else
            lvEnInicio.Sorting = SortOrder.Ascending;
        lvEnInicio.Sort();
    }  
    //
    private void lvEnEjecucion_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e) 
    {
        if( lvEnEjecucion.Sorting == SortOrder.Ascending )
            lvEnEjecucion.Sorting = SortOrder.Descending;
        else
            lvEnEjecucion.Sorting = SortOrder.Ascending;
        lvEnEjecucion.Sort();
    }  
 
    private void btnRefrescarInicio_Click(System.Object sender, System.EventArgs e) 
    {
        mostrarEnInicio();
    }  
}

 


Código de ejemplo (comprimido):

Nota sobre el checksum MD5:
La utilidad MD5.exe para comprobar la integridad de los ficheros la puedes bajar de este sitio:
MD5- Command Line Message Digest Utility (http://www.fourmilab.ch/md5/)

La versión para Windows (con el código fuente): md5.zip

Para usar la utilidad MD5, simplemente escribe desde la línea de comandos:
MD5 <nombre del fichero> y te mostrará el número de "checksum" que debe coincidir con el mostrado, si no coincide... ¡NO TE FÍES DE ESE FICHERO! ya que puede estar mal o "manipulado".
Si se te da el caso de que el checksum mostrado no coincide con el que te muestre esa utilidad, por favor avísame indicando el nombre del fichero, el checksum que has obtenido y de dónde has bajado el fichero.
Gracias.


El ejecutable y el código fuente los puedes bajar usando estos links:

El ejecutable (VB): Procesos_en_Inicio_bin.zip - 12.5 KB
(MD5 checksum: F1CAD928596291FB1EBDEC5F04EBA04C)

El código fuente, tanto para VB como para C#: Procesos_en_inicio_src.zip - 56.2 KB
(MD5 checksum: 3112446D5EC501B08CE544BFC9BAFA37)


 


La fecha/hora en el servidor es: 13/11/2024 9:45:47

La fecha actual GMT (UTC) es: 

©Guillermo 'guille' Som, 1996-2024