none
Instalar servicio o hacer una aplicacion autoejecutable al arrancar windows [RESUELTO] RRS feed

  • Pregunta

  • Hola muy buenas, quiero saber como instalar un servicio desde dentro de una aplicación.

    Como por ejemplo tienen otros programas que en su configuración pone Arrancar con Windows.

    o saber como se instala un servicio que abra la misma aplicación. 


    La aplicacion principal Es Agenda nuesta, que es una gestor de tareas y contactos. 

    Alarma es un simple formulario que el usuario que haya iniciado sesión en Agendanuestra busca las tareas para poder sonar un Mp3 que hace de sonido de alarma.

    Instalador es para instalar las aplicaciones obviamente. 

    Y el servicio de Alarma es un servicio que quiero arrancar desde Agendanuestra para que al arrancar windows Abra

    automáticamente el proyecto Alarma.

    A ver si alguien me puede hechar una mano con esto, llevo atascado unos días.

    Un saludo y gracias!

    Servivio Alarma:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Linq;
    using System.ServiceProcess;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ServivioAlarma
    {
        public partial class Service1 : ServiceBase
        {
            public Service1()
            {
                InitializeComponent();
    
            }
            protected override void OnStart(string[] args)
            {
                var resultado = System.Diagnostics.Process.GetProcessesByName("Alarma");
                foreach (var item in resultado)
                {
                    item.Kill();
                }
                Boolean encontrado = false;                
                while (encontrado == false)
                {
                    encontrado = AccesoInternet();
                }
                Process.Start("Alarma.exe");
            }
    
           private bool AccesoInternet()       
           {
                try
                {
                    System.Net.IPHostEntry host = System.Net.Dns.GetHostEntry("www.google.com");
                    return true;
                }
                catch (Exception es)
                {
                    return false;
                }
            }
    
            protected override void OnStop()
            {
                var resultado = System.Diagnostics.Process.GetProcessesByName("Alarma");
                foreach (var item in resultado)
                {
                    item.Kill();
                }
            }
        }
    }


    Alarma

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Data.SqlClient;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using AxWMPLib;
    using WMPLib;
    
    namespace WindowsFormsApplication1
    {
        public partial class Principal : Form
        {
            string alarma = Path.Combine(Application.StartupPath, "alarma.mp3");
            AxWMPLib.AxWindowsMediaPlayer song= new AxWindowsMediaPlayer();
            private int contador = 0;
            private string user="";
              Conexion con = new Conexion();
    
            private string TareaActiva = "";
            public Principal()
            {
                InitializeComponent();
                song.CreateControl();
                this.comboBox1.SelectedIndex = 0;
                this.Opacity = 0.8;
                this.ShowInTaskbar = false;
                
                //Posicionar abajo a la derecha
                int deskHeight = Screen.PrimaryScreen.WorkingArea.Height; 
                int deskWidth = Screen.PrimaryScreen.WorkingArea.Width;
                this.Location = new Point(deskWidth-this.Width, deskHeight-this.Height);
                this.timer1.Interval = 9000;
                this.timer1.Enabled = true;
                
                con.PruebadeConexion();
                if(con.Con != null)
                Hide();
            }
    
            private void sonaralarma()
            {
                song.URL = alarma;
                song.settings.setMode("loop", false);
                song.settings.autoStart = true;
                this.TopMost = true;
                this.Visible = true;
                this.Show();
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
    
                if (con.Con.State == ConnectionState.Open)
                {
                    if (user != "")
                    {
                        var hora = DateTime.Now.ToString("HH:mm");
    
                        String sql = "select * from tareas where alarma=1 and ( privado = 0 or privado =1 and usuario = " +
                                     user + ") and fecha <= convert(date,'" + DateTime.UtcNow.ToString() +
                                     "') and convert(time,hora) <= convert(time,'" + hora + "')   ";
    
                        SqlDataReader dato = con.ejecutarquery(sql);
    
                        if (dato != null)
                        {
                            dato.Read();
                            TareaActiva = dato[0].ToString();
                            //Clipboard.SetText(sql);
                            this.labelinformacionalarma.Text = dato[1].ToString() + "\n" + dato[2].ToString();
                            this.Show();
                            this.WindowState = FormWindowState.Normal;
                            this.TopMost = true;
                            this.Focus();
                            this.BringToFront();
                            sonaralarma();
                            dato.Close();
                        }
                    }
                    leeruser();
    
                }
                else
                {
                    con.PruebadeConexion();
                    MessageBox.Show("Compruebe la conexion");
                }
    
            }
            void leeruser()
            {
                try
                {
                    if (File.Exists(@"usuario.dat"))
                    {
                        System.IO.StreamReader file = new System.IO.StreamReader(@"usuario.dat");
                        var usuario = file.ReadLine();
                        user = usuario.Split('|')[1];
                        file.Close();
                    }
                }
                catch (Exception ew)
                {
                }
            }
            private void button1_Click(object sender, EventArgs e)
            {
                song.Ctlcontrols.stop();
                var sql ="" ;
                
                if (this.comboBox1.SelectedIndex == 0)
                {
                    //Añadimos 10 minutos
                    sql = "update tareas set hora = DATEADD(minute,10,hora) where idtarea = "+TareaActiva;
                }
                else if (this.comboBox1.SelectedIndex == 1)
                {
                    //1 HorizontalAlignment 
                    sql = "update tareas set hora = DATEADD(hour,1,hora) where idtarea = " + TareaActiva;
                }
                else if (this.comboBox1.SelectedIndex == 2)
                {
                    //4 horas
                    sql = "update tareas set hora = DATEADD(hour,4,hora) where idtarea = " + TareaActiva;
             
                }
                else if (this.comboBox1.SelectedIndex == 3)
                {
                    sql = "update tareas set fecha = DATEADD(day,1,fecha) where idtarea = " + TareaActiva;
    
                }
                else if (this.comboBox1.SelectedIndex == 4)
                {
                    sql= "Update tareas set alarma = 0 where idtarea ="+TareaActiva;
                }
    
                con.EjecutarSQLinsertoUpdate(sql);
    
                this.Hide();
                
            }
        }
    }

    en agendanuestra tengo esto en un apartado:

     int encontrado = 0;
    
                        var resultado = System.Diagnostics.Process.GetProcessesByName("Alarma");
                        foreach (var item in resultado)
                        {
                            encontrado = 1;
                        }
                        if(encontrado ==0)
                            InstallService("ServivioAlarma.exe");



    • Editado Javilepe martes, 11 de diciembre de 2018 10:33
    jueves, 11 de octubre de 2018 16:02

Respuestas

  • hola

    Podrias crear una pequeña aplicacion que se minimice en el try icon al lado del reloj en la barra de herramientas, seria quien realice la notificacion o abra la aplicacion que necesites

     How To Minimize Your Application To System Tray In C#

    Podrias poner esta app que inicie con windows si la ingresas en startup de windows

    Windows 10 Startup Folder Location. Add A Program To Startup In Windows 10

    si es algo que va a trabajar con al pantalla no necesitas un servicio de windows ya qe este no tiene interaccion con la screen del usuario, por eso una app que se minimice como icono es mejor

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    jueves, 11 de octubre de 2018 16:49
  • Con permiso me AutoRespondo!!

    Lo hice con el cambio de estado de un checkBox 

            private void checkBox1_CheckedChanged(object sender, EventArgs e)
            {
                
                if (checkBoxAlarma.Checked && Alarma==false)
                {
                    ArrancarAlInicio(Microsoft.Win32.Registry.LocalMachine, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\", "Alarma.exe", "\"" + Application.StartupPath + "\\" + "Alarma.exe" + "\"");
                    Alarma = true;
                }
                else if (!checkBoxAlarma.Checked && Alarma==true)
                {
                   // NoArrancarAlInicio(Microsoft.Win32.Registry.LocalMachine, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\", "Alarma.exe", "\"" + Application.ExecutablePath.ToString() + "\"");
                    NoArrancarAlInicio(Microsoft.Win32.Registry.LocalMachine, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\", "Alarma.exe", "\"" + Application.StartupPath + "\\" + "Alarma.exe" + "\"");
                    Alarma = false;
                }
            }

    Y aquí las dos funciones, una para añadirlo al inicio de windows y otra para quitarlo.

         public bool ArrancarAlInicio(RegistryKey baseKey, string keyPath, string KeyName, object Value)
            {
               try
                {
                    // Setting 
                    RegistryKey rk = baseKey;
                    // I have to use CreateSubKey 
                    // (create or open it if already exits), 
                    // 'cause OpenSubKey open a subKey as read-only 
                    RegistryKey sk1 = rk.CreateSubKey(keyPath); 
                        // Save the value 
                        sk1.SetValue(KeyName.ToUpper(), Value);
                        return true;
                }
                catch (Exception e)
                {
                    // an error! 
                    MessageBox.Show(e.Message, "Writing registry " + KeyName.ToUpper());
                    return false;
                }
                
            }
            public bool NoArrancarAlInicio(RegistryKey baseKey, string keyPath, string KeyName, object Value)
            {
                 try
                {
                    // Setting 
                    RegistryKey rk = baseKey;
                    // I have to use CreateSubKey 
                    // (create or open it if already exits), 
                    // 'cause OpenSubKey open a subKey as read-only 
                    RegistryKey sk1 = rk.CreateSubKey(keyPath);
                    
                    // Save the value 
                    sk1.DeleteValue(KeyName.ToUpper(), false);
    
                    return true;
                }
                catch (Exception e)
                {
                    // an error! 
                    MessageBox.Show(e.Message, "Writing registry " + KeyName.ToUpper());
                    return false;
                }
               
            }
    

    Y por si fuera poco, os dejo también código para ver qué es lo que actualmente se inicia al arrancar cuando pulso un botón.

       private void button1_Click(object sender, EventArgs e)
            {
                RegistryKey rk = Microsoft.Win32.Registry.LocalMachine;
                rk = rk.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
               // NoArrancarAlInicio(Microsoft.Win32.Registry.LocalMachine, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\", "AGENDAMARKETING.EXE", "\"" + Application.ExecutablePath.ToString() + "\"");
               // NoArrancarAlInicio(Microsoft.Win32.Registry.LocalMachine, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\", "ALARMA.EXE", "\"" + Application.ExecutablePath.ToString() + "\"");
                if (rk == null)
                    MessageBox.Show("está vacio");
                else
                {
                    String[] subKeys = rk.GetValueNames();
                    String rs = "";
                    for (int i = 0; i < subKeys.Count(); i++)
                        rs += subKeys[i] + "; ";
                    MessageBox.Show(rs);
                }
                
            }

    Un saludo!


    JaV1

    jueves, 18 de octubre de 2018 7:55
  • Hola buenas taerdes, lo que debes hacer en crearte un proyecto tipo servicio, que te ofrece .NET :

    https://docs.microsoft.com/es-es/dotnet/framework/windows-services/how-to-create-windows-services

    https://docs.microsoft.com/en-us/dotnet/framework/windows-services/walkthrough-creating-a-windows-service-application-in-the-component-designer

    Saludos.

    jueves, 11 de octubre de 2018 16:19
  • Si vas a tener interaccion con la pantalla un servicio de windows no te sirve, un servicio aplicaria si la notificacion se realizaria por mail o algo que no se muestr o ejecute otra aplicacion que requiera verse

    realiza un .exe normal y minimizalo al tryicon para que desde alli pueda notificar en pantalla

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 11 de octubre de 2018 16:53
  • Si vas a tener interaccion con la pantalla un servicio de windows no te sirve, un servicio aplicaria si la notificacion se realizaria por mail o algo que no se muestr o ejecute otra aplicacion que requiera verse

    realiza un .exe normal y minimizalo al tryicon para que desde alli pueda notificar en pantalla

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Algo parecido es lo que tengo creado, pero sin bajar al tryicon. Simplemente hace un Hide(). para que no se muestre, pero que si miras en el administrador de tareas si que aparezca.

    Lo único que me falta, es que ese EXE, arranque al iniciar windows.

    ya el funcionamiento del programa está terminado, y funcionando bien. 

    Solo quiero que este comprobador de tareas arranque al iniciar el SO.

    Un saludo


    JaV1

    lunes, 15 de octubre de 2018 10:32
  • hola

    Podrias crear una pequeña aplicacion que se minimice en el try icon al lado del reloj en la barra de herramientas, seria quien realice la notificacion o abra la aplicacion que necesites

     How To Minimize Your Application To System Tray In C#

    Podrias poner esta app que inicie con windows si la ingresas en startup de windows

    Windows 10 Startup Folder Location. Add A Program To Startup In Windows 10

    si es algo que va a trabajar con al pantalla no necesitas un servicio de windows ya qe este no tiene interaccion con la screen del usuario, por eso una app que se minimice como icono es mejor

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    Eso de ahí es lo que yo quiero hacer, pero lo que no se es como programar, que cuando un check esté marcado, me ponga esta aplicación para que arranque desde el inicio de windows.

    O incluso sin check, que cuando arranque el programa principal se haga solo.

    ¿Como programo esto? ¿Qué tengo que hacer?
    -¿Hay que tocar el registro de windows?
    -¿Copio un shortcut al directorio de Startup? (Cosa que he hecho manualmente y no ha funcionado.)

    A ver si alguien puede echarme un cable, por favor.

    Gracias


    JaV1

    lunes, 15 de octubre de 2018 11:13

Todas las respuestas

  • Hola buenas taerdes, lo que debes hacer en crearte un proyecto tipo servicio, que te ofrece .NET :

    https://docs.microsoft.com/es-es/dotnet/framework/windows-services/how-to-create-windows-services

    https://docs.microsoft.com/en-us/dotnet/framework/windows-services/walkthrough-creating-a-windows-service-application-in-the-component-designer

    Saludos.

    jueves, 11 de octubre de 2018 16:19
  • hola

    Podrias crear una pequeña aplicacion que se minimice en el try icon al lado del reloj en la barra de herramientas, seria quien realice la notificacion o abra la aplicacion que necesites

     How To Minimize Your Application To System Tray In C#

    Podrias poner esta app que inicie con windows si la ingresas en startup de windows

    Windows 10 Startup Folder Location. Add A Program To Startup In Windows 10

    si es algo que va a trabajar con al pantalla no necesitas un servicio de windows ya qe este no tiene interaccion con la screen del usuario, por eso una app que se minimice como icono es mejor

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    jueves, 11 de octubre de 2018 16:49
  • Si vas a tener interaccion con la pantalla un servicio de windows no te sirve, un servicio aplicaria si la notificacion se realizaria por mail o algo que no se muestr o ejecute otra aplicacion que requiera verse

    realiza un .exe normal y minimizalo al tryicon para que desde alli pueda notificar en pantalla

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 11 de octubre de 2018 16:53
  • El servicio tambien lo tengo creado, pero se como instalarlo desde la shell de windows, osea con installutil.

    Pero quiero que lo instale mi aplicacion ya creada en C#.

    Hay alguna manera?

    Gracias!


    JaV1


    • Editado Javilepe lunes, 15 de octubre de 2018 6:39
    lunes, 15 de octubre de 2018 6:26
  • Si vas a tener interaccion con la pantalla un servicio de windows no te sirve, un servicio aplicaria si la notificacion se realizaria por mail o algo que no se muestr o ejecute otra aplicacion que requiera verse

    realiza un .exe normal y minimizalo al tryicon para que desde alli pueda notificar en pantalla

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Algo parecido es lo que tengo creado, pero sin bajar al tryicon. Simplemente hace un Hide(). para que no se muestre, pero que si miras en el administrador de tareas si que aparezca.

    Lo único que me falta, es que ese EXE, arranque al iniciar windows.

    ya el funcionamiento del programa está terminado, y funcionando bien. 

    Solo quiero que este comprobador de tareas arranque al iniciar el SO.

    Un saludo


    JaV1

    lunes, 15 de octubre de 2018 10:32
  • hola

    Podrias crear una pequeña aplicacion que se minimice en el try icon al lado del reloj en la barra de herramientas, seria quien realice la notificacion o abra la aplicacion que necesites

     How To Minimize Your Application To System Tray In C#

    Podrias poner esta app que inicie con windows si la ingresas en startup de windows

    Windows 10 Startup Folder Location. Add A Program To Startup In Windows 10

    si es algo que va a trabajar con al pantalla no necesitas un servicio de windows ya qe este no tiene interaccion con la screen del usuario, por eso una app que se minimice como icono es mejor

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    Eso de ahí es lo que yo quiero hacer, pero lo que no se es como programar, que cuando un check esté marcado, me ponga esta aplicación para que arranque desde el inicio de windows.

    O incluso sin check, que cuando arranque el programa principal se haga solo.

    ¿Como programo esto? ¿Qué tengo que hacer?
    -¿Hay que tocar el registro de windows?
    -¿Copio un shortcut al directorio de Startup? (Cosa que he hecho manualmente y no ha funcionado.)

    A ver si alguien puede echarme un cable, por favor.

    Gracias


    JaV1

    lunes, 15 de octubre de 2018 11:13
  • Con permiso me AutoRespondo!!

    Lo hice con el cambio de estado de un checkBox 

            private void checkBox1_CheckedChanged(object sender, EventArgs e)
            {
                
                if (checkBoxAlarma.Checked && Alarma==false)
                {
                    ArrancarAlInicio(Microsoft.Win32.Registry.LocalMachine, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\", "Alarma.exe", "\"" + Application.StartupPath + "\\" + "Alarma.exe" + "\"");
                    Alarma = true;
                }
                else if (!checkBoxAlarma.Checked && Alarma==true)
                {
                   // NoArrancarAlInicio(Microsoft.Win32.Registry.LocalMachine, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\", "Alarma.exe", "\"" + Application.ExecutablePath.ToString() + "\"");
                    NoArrancarAlInicio(Microsoft.Win32.Registry.LocalMachine, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\", "Alarma.exe", "\"" + Application.StartupPath + "\\" + "Alarma.exe" + "\"");
                    Alarma = false;
                }
            }

    Y aquí las dos funciones, una para añadirlo al inicio de windows y otra para quitarlo.

         public bool ArrancarAlInicio(RegistryKey baseKey, string keyPath, string KeyName, object Value)
            {
               try
                {
                    // Setting 
                    RegistryKey rk = baseKey;
                    // I have to use CreateSubKey 
                    // (create or open it if already exits), 
                    // 'cause OpenSubKey open a subKey as read-only 
                    RegistryKey sk1 = rk.CreateSubKey(keyPath); 
                        // Save the value 
                        sk1.SetValue(KeyName.ToUpper(), Value);
                        return true;
                }
                catch (Exception e)
                {
                    // an error! 
                    MessageBox.Show(e.Message, "Writing registry " + KeyName.ToUpper());
                    return false;
                }
                
            }
            public bool NoArrancarAlInicio(RegistryKey baseKey, string keyPath, string KeyName, object Value)
            {
                 try
                {
                    // Setting 
                    RegistryKey rk = baseKey;
                    // I have to use CreateSubKey 
                    // (create or open it if already exits), 
                    // 'cause OpenSubKey open a subKey as read-only 
                    RegistryKey sk1 = rk.CreateSubKey(keyPath);
                    
                    // Save the value 
                    sk1.DeleteValue(KeyName.ToUpper(), false);
    
                    return true;
                }
                catch (Exception e)
                {
                    // an error! 
                    MessageBox.Show(e.Message, "Writing registry " + KeyName.ToUpper());
                    return false;
                }
               
            }
    

    Y por si fuera poco, os dejo también código para ver qué es lo que actualmente se inicia al arrancar cuando pulso un botón.

       private void button1_Click(object sender, EventArgs e)
            {
                RegistryKey rk = Microsoft.Win32.Registry.LocalMachine;
                rk = rk.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);
               // NoArrancarAlInicio(Microsoft.Win32.Registry.LocalMachine, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\", "AGENDAMARKETING.EXE", "\"" + Application.ExecutablePath.ToString() + "\"");
               // NoArrancarAlInicio(Microsoft.Win32.Registry.LocalMachine, @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run\", "ALARMA.EXE", "\"" + Application.ExecutablePath.ToString() + "\"");
                if (rk == null)
                    MessageBox.Show("está vacio");
                else
                {
                    String[] subKeys = rk.GetValueNames();
                    String rs = "";
                    for (int i = 0; i < subKeys.Count(); i++)
                        rs += subKeys[i] + "; ";
                    MessageBox.Show(rs);
                }
                
            }

    Un saludo!


    JaV1

    jueves, 18 de octubre de 2018 7:55