Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Meta en 29 Julio 2020, 17:12 pm



Título: Preguntar antes de salir
Publicado por: Meta en 29 Julio 2020, 17:12 pm
Buenas:

Tengo un programa hecho a medias. Está hecho con la consola C#.

Al pulsar la X de la ventana, quiero que haga estas cosas.
Pregunta si realmente quiero salir, si salgo, pone esto.

Código
  1.                            Si pulso X con el ratón
  2.                            {
  3.                                Puerto_serie.Write("Puerto y aplicación cerrado."); // Enviar mensaje.
  4.                                Puerto_serie.Close(); // Cierra el puerto serie.
  5.                                Environment.Exit(0); // Cerrar aplicación.
  6.                            }

Arriaba está mal planteado.

Primero pregunta si quiero salir, con un Sí y un No, si pulso No, el programa sigue su curso, si pongo Si, cierra el programa y me envía estos datos al puerto serie antes de que cierre del todo.

Código
  1.                                Puerto_serie.Write("Puerto y aplicación cerrado."); // Enviar mensaje.
  2.                                Puerto_serie.Close(); // Cierra el puerto serie.
  3.                                Environment.Exit(0); // Cerrar aplicación.

Código ejemplo casi completo.
Código
  1. using System;
  2. using System.IO.Ports;
  3.  
  4. namespace Introducir_datos_puerto_serie_consola_01
  5. {
  6.    class Program
  7.    {
  8.        static void Main(string[] args)
  9.        {
  10.            // Título de la ventana.
  11.            Console.Title = "Enviar datos al puerto serie";
  12.  
  13.            // Tamaño de la ventana, x, y.
  14.            Console.SetWindowSize(70, 25);
  15.  
  16.            // Color de fondo.
  17.            Console.BackgroundColor = ConsoleColor.Blue;
  18.  
  19.            // Color de las letras.
  20.            Console.ForegroundColor = ConsoleColor.Yellow;
  21.  
  22.            // Limpiar pantalla y dejarlo todo gris.
  23.            Console.Clear();
  24.  
  25.            // Visible el cursor.
  26.            Console.CursorVisible = true;
  27.  
  28.            // Cree un nuevo objeto SerialPort con la configuración predeterminada.
  29.            SerialPort Puerto_serie = new SerialPort("COM3");
  30.  
  31.            Puerto_serie.BaudRate = 115200;
  32.            Puerto_serie.Parity = Parity.None;
  33.            Puerto_serie.StopBits = StopBits.One;
  34.            Puerto_serie.DataBits = 8;
  35.            Puerto_serie.Handshake = Handshake.None;
  36.            Puerto_serie.RtsEnable = true;
  37.  
  38.            // Establecer los tiempos de espera de lectura / escritura.
  39.            Puerto_serie.ReadTimeout = 500; // Milisegundos.
  40.            Puerto_serie.WriteTimeout = 500;
  41.  
  42.            // Detecta cualquier dato recibido.
  43.            Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
  44.  
  45.            Puerto_serie.Open(); // Abrir puerto.
  46.  
  47.            //Console.CursorSize = 1;
  48.  
  49.            do
  50.            {
  51.                Console.Write("Introduzca un texto: ");
  52.                string texto;
  53.                texto = Console.ReadLine();
  54.                Console.WriteLine("El texto introducido es: " + texto);
  55.  
  56.                //texto = Encoding.ASCII.GetBytes("Luz_ON"); // Codificación ASCII y guarda en la variable array tipo byte.
  57.                Puerto_serie.Write(texto); // Envía los datos del string todo su contenido.
  58.                Console.WriteLine("Comando {0} enviado.", texto); // Muestra en pantalla comandos enviado.
  59.                Console.WriteLine();
  60.  
  61.                // ################ Pregunta aquí si quieres salir.   ################
  62.                            //Si pulso X con el ratón
  63.                            //{
  64.                            //    Puerto_serie.Write("Puerto y aplicación cerrado."); // Enviar mensaje.
  65.                            //    Puerto_serie.Close(); // Cierra el puerto serie.
  66.                            //    Environment.Exit(0); // Cerrar aplicación.
  67.                            //}
  68.                // #####################################################################
  69.  
  70.            } while (true);
  71.  
  72.  
  73.        }
  74.  
  75.        // Detecta cualquier dato entrante.
  76.        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
  77.        {
  78.            SerialPort sp = (SerialPort)sender;
  79.            string entradaDatos = sp.ReadExisting(); // Almacena los datos recibidos en la variable tipo string.
  80.            Console.WriteLine("Datos recibido desde Arduino: " + entradaDatos); // Muestra en pantalla los datos recibidos.
  81.        }
  82.    }
  83. }
  84.  

Gracias camaradas.

Saludos.


Título: Re: Preguntar antes de salir
Publicado por: ThunderCls en 29 Julio 2020, 18:28 pm
Necesitas interceptar el evento del cierre de tu consola con SetConsoleCtrlHandler

https://stackoverflow.com/questions/474679/capture-console-exit-c-sharp

NOTA: Ten en cuenta que otro evento que no sea CTRL+C no es posible cancelarlo


Título: Re: Preguntar antes de salir
Publicado por: Meta en 30 Julio 2020, 05:33 am
Bueno:

Para no estar con tanto jaleo.

Mejor una cosa más fácil.

Sin preguntar nada al salir del programa, solo que antes de salir, indique el programa enviar un mensaje al puerto serie y luego cierra el puerto.

Código
  1.                                Puerto_serie.Write("Puerto y aplicación cerrado."); // Enviar mensaje.
  2.                                Puerto_serie.Close(); // Cierra el puerto serie.

Eso lo prefiero más y no tanto rollo.