elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


  Mostrar Temas
Páginas: 1 2 3 4 5 6 7 8 9 10 11 [12] 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ... 66
111  Programación / .NET (C#, VB.NET, ASP) / Guardar en memoria el * en: 13 Junio 2020, 15:40 pm
Hola:

Aquí un programa hecho en consola, solo se usa las flechas del teclado y Enter.

Este programa se basa en radioButton, que en este caso funciona si selecciona una opción y pulsas Enter, se pone un asterisco. Hasta ahí bien.

Al pulsar Salir, luego Entrar, no se queda guardado el * en el último radioButton seleccionado.

¿Cómo se hace?

El código que tengo por ahora lo dejo aquí.

Código:
using System;

namespace radioButton_consola_02_cs
{
    class Program
    {
        #region Variables.
        private static readonly string[] TEXTO = new string[]
        {
            "( ) Opción A        ",
            "( ) Opción B        ",
            "( ) Opción C        ",
            "    SALIR"
        };
        #endregion

        static void Main(string[] args)
        {
            // Tamaño de la ventana.
            Console.SetWindowSize(20, 5);

            // Fondo verde.
            Console.BackgroundColor = ConsoleColor.Blue;

            // Letras negras.
            Console.ForegroundColor = ConsoleColor.White;

            // Oculto el cursor.
            Console.CursorVisible = false;

            // Almacena la tecla pulsada en la variable.
            ConsoleKey teclaInicial;

            do
            {
                // Limpiar pantalla.
                Console.Clear();

                // Posición del cursor del título del MENÚ PRINCIPAL.
                Console.SetCursorPosition(0, 0);

                // Título.
                Console.Write("   MENÚ PRINCIPAL   ");

                // Pocisión de la hora.
                Console.SetCursorPosition(4, 2);

                // Formato numérico dd/MM/yyyy.
                Console.Write(DateTime.Now.ToString("ddd dd MMM"));

                // Almacena en la variable una tecla pulsada.
                teclaInicial = Console.ReadKey(true).Key;

                // ¿Haz pulsado la tecla Enter?
                if (teclaInicial == ConsoleKey.Enter)
                {
                    // Sí. Se ejecuta esta función.
                    MenuPrincipal();
                }
            } while (teclaInicial != ConsoleKey.Escape);

            #region Menú Principal.
            void MenuPrincipal()
            {
                bool salir = false;

                // En itemSelecionado:
                // -1 = Sin seleccionar con * ninguna opción.
                // 0 = Seleccionar con * la Opción A.
                // 1 = Seleccionar con * la Opción B.
                // 2 = Seleccionar con * la opción C.
                int itemSeleccionado = 0;
                int itemSeñalado = 0;

                // Capturar tecla para luego validar.
                ConsoleKey tecla;

                do
                {
                    //******************************************************************
                    // Dibujo el menú principal.

                    // Rellenar fondo verde.
                    //Console.BackgroundColor = ConsoleColor.Green;

                    // Letras negras.
                    //Console.ForegroundColor = ConsoleColor.Black;

                    // Limpiar pantalla.
                    Console.Clear();

                    for (int k = 0; k < TEXTO.Length; k++)
                    {
                        Console.SetCursorPosition(0, k);
                        Console.Write(itemSeñalado == k ? "> " : "  ");
                        Console.Write(TEXTO[k]);
                        Console.SetCursorPosition(3, k);
                        Console.Write(itemSeleccionado == k ? "*" : " ");
                    }

                    // Fin de pintar el menú principal.
                    //******************************************************************

                    // Leer tecla ingresada por el usuario.
                    tecla = Console.ReadKey(true).Key;

                    switch (tecla)
                    {
                        case ConsoleKey.Enter:
                            itemSeleccionado = itemSeñalado;
                            salir = (itemSeleccionado == TEXTO.Length - 1);
                            break;

                        case ConsoleKey.DownArrow:
                            if (++itemSeñalado >= TEXTO.Length)
                            {
                                itemSeñalado = 0;
                            }
                            break;

                        case ConsoleKey.UpArrow:
                            if (--itemSeñalado < 0)
                            {
                                itemSeñalado = TEXTO.Length - 1;
                            }
                            break;
                    }
                    // Uso la tecla escape como salida.
                } while (!salir);
            }
            #endregion
        }
    }
}

Saludos.
112  Programación / .NET (C#, VB.NET, ASP) / Corregir un fallo en: 11 Junio 2020, 12:33 pm
Buenas:



Usando el teclado solo las flechas y el Enter, en este programa puedo escribir nombre y se muestra en pantalla. Al escribir un nombre, pulso Enter y correctamente me lleva a la zona de > "Atrás". Si con la flecha derecha o izquierda me tiene que llevar a la parte de > Guardar.

El problema está que tiene que indicar con el caracter > en Guardar, y se ejecuta directamente, cosa que no debe ser. En la zona Atrás y Guardar solo se ejecuta si pulso Enter.

Dejo el código aquí como ejemplo.
Código
  1. using System;
  2.  
  3. namespace LCD_nombre_archivo_consola_03
  4. {
  5.    class Program
  6.    {
  7.        static string guardarNombre = "";
  8.        static int coordenadaX = 0;
  9.        static ConsoleKey key;
  10.  
  11.        static readonly char[] roALFANUMERICO = new char[] {
  12.            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'Ñ', 'O', 'P',
  13.            'Q', 'R', 'S', 'T', 'U', 'V', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
  14.            'i', 'j', 'k', 'l', 'm', 'n', 'ñ', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'x', 'y',
  15.            'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','.', ',', '-', '_', ':', ';',
  16.            '¿', '?', '(', ')', '[', ']', '{', '}','=', '$','&', '"', ' '};
  17.        static readonly int[] roINDICE_ARRAY = new int[] {
  18.            80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80 };
  19.        static readonly string[] TEXTO = new string[] { "ATRÁS", "GUARDAR" };
  20.        static int index = 0;
  21.        static void Main(string[] args)
  22.        {
  23.            // Título de la pantalla.
  24.            Console.Title = "Cambiar nombre";
  25.  
  26.            Inicio();
  27.        }
  28.  
  29.        #region Inico.
  30.        private static void Inicio()
  31.        {
  32.            // Tamaño de la ventana.
  33.            Console.SetWindowSize(20, 5);
  34.  
  35.            // Fondo verde.
  36.            Console.BackgroundColor = ConsoleColor.Blue;
  37.  
  38.            // Letras negras.
  39.            Console.ForegroundColor = ConsoleColor.White;
  40.  
  41.            Console.Clear();
  42.  
  43.            Console.SetCursorPosition(0, 0);
  44.            Console.Write("Nombre del relé 1:  ");
  45.            Console.SetCursorPosition(0, 1);
  46.            //Console.Write("AAAAAAAAAAAAAAAA");
  47.  
  48.            for (int i = 0; i < roINDICE_ARRAY.Length; i++)
  49.            {
  50.                Console.Write(roALFANUMERICO[roINDICE_ARRAY[i]]);
  51.            }
  52.  
  53.            Console.SetCursorPosition(2, 3);
  54.            Console.Write(TEXTO[0]); // ATRÁS.
  55.            Console.SetCursorPosition(12, 3);
  56.            Console.Write(TEXTO[1]); // GUARDAR.
  57.  
  58.            while (true)
  59.            {
  60.                Console.SetCursorPosition(coordenadaX, 1);
  61.                key = Console.ReadKey(true).Key;
  62.                switch (key)
  63.                {
  64.                    case ConsoleKey.RightArrow:
  65.                        if (coordenadaX < 15)
  66.                            coordenadaX++;
  67.                        break;
  68.  
  69.                    case ConsoleKey.LeftArrow:
  70.                        if (coordenadaX > 0)
  71.                            coordenadaX--;
  72.                        break;
  73.  
  74.                    case ConsoleKey.UpArrow:
  75.                        roINDICE_ARRAY[coordenadaX]++;
  76.                        if (roINDICE_ARRAY[coordenadaX] >= roALFANUMERICO.Length)
  77.                        {
  78.                            roINDICE_ARRAY[coordenadaX] = 0;
  79.                        }
  80.                        Console.Write(roALFANUMERICO[roINDICE_ARRAY[coordenadaX]]);
  81.                        break;
  82.  
  83.                    case ConsoleKey.DownArrow:
  84.                        roINDICE_ARRAY[coordenadaX]--;
  85.                        if (roINDICE_ARRAY[coordenadaX] < 0)
  86.                        {
  87.                            roINDICE_ARRAY[coordenadaX] = roALFANUMERICO.Length - 1;
  88.                        }
  89.                        Console.Write(roALFANUMERICO[roINDICE_ARRAY[coordenadaX]]);
  90.                        break;
  91.  
  92.                    case ConsoleKey.Enter:
  93.                        Console.SetCursorPosition(1, 3);
  94.                        Console.Write(">");
  95.  
  96.                        while (true)
  97.                        {
  98.                            key = Console.ReadKey(true).Key;
  99.  
  100.                            switch (key)
  101.                            {
  102.                                case ConsoleKey.RightArrow:
  103.                                case ConsoleKey.LeftArrow:
  104.                                    index = 1 - index;
  105.                                    break;
  106.  
  107.                                case ConsoleKey.UpArrow:
  108.                                case ConsoleKey.DownArrow:
  109.                                    Console.SetCursorPosition(coordenadaX, 1);
  110.                                    break;
  111.  
  112.                                case ConsoleKey.Enter:
  113.  
  114.                                    break;
  115.                            }
  116.  
  117.                            for (int a = 0; a < 2; a++)
  118.                            {
  119.                                Console.SetCursorPosition(1 + (10 * a), 3);
  120.                                if (a == index)
  121.                                    Console.Write(">");
  122.                                else
  123.                                    Console.Write(" ");
  124.                            }
  125.  
  126.                            if (index == 0)  // se pulsó Atrás
  127.                            {
  128.                                Atras();
  129.                                //break;  // vuelve a la edición de letras
  130.                            }
  131.                            else if (index == 1)  // se pulsó Guardar
  132.                            {
  133.                                Guardar();
  134.                            }
  135.                        }
  136.                }
  137.            }
  138.        }
  139.        #endregion
  140.  
  141.        private static void Atras()
  142.        {
  143.            Console.Clear();
  144.            Console.SetCursorPosition(0, 1);
  145.            Console.Write("HAS PULSADO ATRÁS   ");
  146.            Console.ReadKey(); // Pulse cualquier tecla para salir.
  147.        }
  148.  
  149.        private static void Guardar()
  150.        {
  151.            Console.Clear();
  152.            Console.SetCursorPosition(0, 1);
  153.            Console.Write("HAS GUARDADO       ");
  154.            for (int a = 0; a < roINDICE_ARRAY.Length; a++)
  155.                guardarNombre += roALFANUMERICO[roINDICE_ARRAY[a]].ToString();
  156.            Console.SetCursorPosition(0, 2);
  157.            Console.Write(guardarNombre);
  158.        }
  159.    }
  160. }

Un cordial saludos.
113  Programación / .NET (C#, VB.NET, ASP) / Cambio de estilo en: 4 Abril 2020, 20:28 pm
Hola:

En un archivo de Arduino C, se escribe algo así.
Código
  1. void setup()
  2. {
  3.  // put your setup code here, to run once:
  4.  
  5. }
  6.  
  7. void loop()
  8. {
  9.  // put your main code here, to run repeatedly:
  10.  
  11. }

Quiero simularlo en C# los setup y loop. Que daría en C# así:
Código
  1. using System;
  2.  
  3. namespace Prueba
  4. {
  5.    class Program
  6.    {
  7.        static void Main(string[] args)
  8.        {
  9.            setup();
  10.            while (true)
  11.            {
  12.                loop();
  13.            }
  14.        }
  15.  
  16.        private static void setup()
  17.        {
  18.          // put your setup code here, to run once:
  19.        }
  20.  
  21.        private static void loop()
  22.        {
  23.          // put your main code here, to run repeatedly:
  24.        }
  25.    }
  26. }

Mostrar texto en consola de C# es así:
Código
  1. Console.Write"¡Hola Mundo!";

En Arduino mostarlo en un LCD es así:
Código
  1. lcd.printf("¡Hola Mundo!");

Se crea en C# simulando el C de Arduino así:
Código
  1. public static class lcd{
  2.  
  3.    public static void printf(string mensaje){
  4.  
  5.        Console.Write(mensaje);
  6.  
  7.   }
  8.  
  9. }

¿Cómo hago en C# una buena plantilla para que se vea solo lo de abajo?
Código
  1.    void setup()
  2.    {
  3.      // put your setup code here, to run once:
  4.  
  5.    }
  6.  
  7.    void loop()
  8.    {
  9.      // put your main code here, to run repeatedly:
  10.  
  11.    }

En pleno C#.

Saludos.
114  Programación / .NET (C#, VB.NET, ASP) / Seleccionar > en las opciones en: 31 Marzo 2020, 05:24 am
Buenas:



Este programa se trata de usar solo las teclas de las flechas y Enter. Ninguna más. Me funciona lo de cambiar un nombre con las teclas de las flechas. Una vez que tenga el nombre, si pulsas la Tecla Enter, tiene que aparecer este símbolo > al lado donde pone ATRÁS.

Tiene que aparecer así:

Citar
> ATRÁS      GUARDAR

Desde que esté el signo > en ATRÁS, ya se puede mover hacia GUARDAR, puedes elegir con las flechas del teclado, izquierda y derecha.

Independientemente donde esté el > sea en ATRÁS o en GUARDAR, si pulsas las flechas arriba o abajo, se pone en la parte del nombre para cambiarlo otra vez, una vez que tenga el nombre que quieras, pulsas Enter otra vez y se va este > a ATRÁS como dije antes.

Si el > está en GUARDAR como indica abajo.

Citar
ATRÁS     > GUARDAR

Si pulsas Enter, guarda el nombre que hayas puesto en la variable guardaNombre. Se queda simplemente almacenado ahí del programa.

Si vuelves con el > en ATRÁS y pulsas Enter. Muentra un mensaje en pantalla. Haz pulsado ATRÁS y el programa se queda ahí.

Espero que se entienda los paso que he escrito, si no se entiende algo, lo comentan.

Sólo he hecho esto.

Código C#:
Código
  1. using System;
  2.  
  3. namespace LCD_nombre_archivo_consola_02
  4. {
  5.    class Program
  6.    {
  7.        static void Main(string[] args)
  8.        {
  9.            // T&#237;tulo de la pantalla.
  10.            Console.Title = "Cambiar nombre";
  11.  
  12.            // Tama&#241;o de la ventana.
  13.            Console.SetWindowSize(20, 5);
  14.  
  15.            string guardarNombre = "";
  16.            int coordenadaX = 0;
  17.            ConsoleKey key;
  18.  
  19.            char[] alfanumerico = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', '&#209;', 'O', 'P',
  20.                'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
  21.            int[] indiceArray = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  22.            string[] texto = new string[] {"ATR&#193;S", "GUARDAR"};
  23.  
  24.            // Fondo verde.
  25.            Console.BackgroundColor = ConsoleColor.Blue;
  26.  
  27.            // Letras negras.
  28.            Console.ForegroundColor = ConsoleColor.White;
  29.  
  30.            Console.Clear();
  31.  
  32.            Console.SetCursorPosition(0, 0);
  33.            Console.Write("Nombre del rel&#233; 1:");
  34.            Console.SetCursorPosition(0, 1);
  35.            Console.Write("AAAAAAAAAAAAAAAA");
  36.            Console.SetCursorPosition(2, 3);
  37.            Console.Write(texto[0]);
  38.            Console.SetCursorPosition(12, 3);
  39.            Console.Write(texto[1]);
  40.  
  41.            while (true)
  42.            {
  43.                Console.SetCursorPosition(coordenadaX, 1);
  44.  
  45.                key = Console.ReadKey(true).Key;
  46.  
  47.                if ((key == ConsoleKey.RightArrow) && (coordenadaX < 15)) // Se cuanta del 0 al 15.
  48.                {
  49.                    coordenadaX++;
  50.                }
  51.                else if ((key == ConsoleKey.LeftArrow) && (coordenadaX > 0))
  52.                {
  53.                    coordenadaX--;
  54.                }
  55.                else if (key == ConsoleKey.UpArrow)
  56.                {
  57.                    indiceArray[coordenadaX]++;
  58.  
  59.                    if (indiceArray[coordenadaX] >= alfanumerico.Length)
  60.                    {
  61.                        indiceArray[coordenadaX] = 0;
  62.                    }
  63.  
  64.                    Console.Write(alfanumerico[indiceArray[coordenadaX]]);
  65.                }
  66.                else if (key == ConsoleKey.DownArrow)
  67.                {
  68.                    indiceArray[coordenadaX]--;
  69.  
  70.                    if (indiceArray[coordenadaX] < 0)
  71.                    {
  72.                        indiceArray[coordenadaX] = alfanumerico.Length - 1;
  73.                    }
  74.  
  75.                    Console.Write(alfanumerico[indiceArray[coordenadaX]]);
  76.                }
  77.            }
  78.        }
  79.    }
  80. }
  81.  
  82.  

Gracias por todo.
115  Programación / Scripting / Crear solo un modelo de Menú y Submenú en: 29 Marzo 2020, 21:03 pm
Hola:

Quiero saber si a estas alturas se puede crear un menú y submenú con la línea de comando de Windows 10, el cmd de siempre. Se que está PowerShell, el sustituto del cmd, pero este es más complicado, nuevo y no entiendo, en realidad, no entiendo ninguno.

Solo se permite usar las flechas del teclado y la tecla Enter para navegar por esos menú y submenús.

Esquema boceto para hacer una idea.


Vídeo:


Saludos.
116  Programación / Programación C/C++ / Redimensionar y quitar tildes o otro carecter que no viene a cuento en: 28 Marzo 2020, 19:46 pm
Hola:

Paso 1.

Quiero quitar caracter raros hasta en el título cuando uso tildes.

Antes usaba el #include "pch.h". Ya no se como añadirlo. Hace dos años que no uso el C++ de Visual Studio Community 2019.
Código
  1. #include <iostream>
  2.  
  3. #include <windows.h> // Para mostrar texto en el título de la ventana.
  4.  
  5.  
  6.  
  7. using namespace std;
  8.  
  9. using std::cout;
  10.  
  11.  
  12.  
  13. int main(void)
  14.  
  15. {
  16.  
  17.  
  18.  
  19. SetConsoleTitle(TEXT("Título de la ventana. Win32 C++ 2019."));
  20.  
  21.  
  22.  
  23. cout << "Terminarías. Conocerías. Título. Analógico. \n";
  24.  
  25. cout << "Muchas gracias mi muy distinguido amigo.";
  26.  
  27.  
  28.  
  29. cin.get();
  30.  
  31. return 0;
  32.  
  33. }

Paso 2.

¿Cómo redimensionar la ventana?

Por ejemplo, en C# se usa esto.
Código
  1.           // Tamaño ventana consola.
  2.  
  3.            // X anchura.
  4.  
  5.            Console.WindowWidth = 20;
  6.  
  7.  
  8.  
  9.            // Y altura.
  10.  
  11.            Console.WindowHeight = 5;

Más fácil aún y en una sola línea es:

Código
  1. Console.SetWindowSize(20, 5);

¿Cómo se hace en C++?

Gracias.
117  Programación / .NET (C#, VB.NET, ASP) / Mover este > y barras en la misma pantalla consola en: 13 Marzo 2020, 21:01 pm
Hola gente del foro:

En la consola C# 2019 quiero hacer un menú con estas dimensiones.

Código
  1.            Console.Title = "Menú de opciones";
  2.  
  3.            // Tamaño ventana consola.
  4.            // X anchura.
  5.            Console.WindowWidth = 20;
  6.  
  7.            // Y altura.
  8.            Console.WindowHeight = 5;
  9.  
  10.            // Oculto el cursor.
  11.            Console.CursorVisible = false;
  12.  
  13.            // Fondo verde.
  14.            Console.BackgroundColor = ConsoleColor.Green;
  15.  
  16.            // Letras negras.
  17.            Console.ForegroundColor = ConsoleColor.Black;

El diseño lo hago primero a mano. Hay que seleccionar o indicar la parte de la pantalla este símbolo >.
Con esto maneja las dos barras indicada abajo y las opciónes ATRÁS y MENÚ.

Las coordenadas del > está indicada en el dibujo de abajo.



Ver zoom.

El > lo mueves solo con flechas del teclado, arriba, abajo, derecha e izquierda.

Para dejarlo más claro, aquí una captura pero no es funcional.


La barra Brillo y Voum. se mueve del 0 al 7.

Antes de sacar un super código horrible, quiero saber cual es la mejor idea y facilidad para el dibujado y que funcione.

Saludos.
118  Programación / .NET (C#, VB.NET, ASP) / Menús y submenús en consola C# en: 28 Febrero 2020, 18:02 pm
Hola:

Haciendo menús y submenús con la consola de C# 2019.

La verdad que he cometido fallos y no se si es posible resolverlo, al menos no se hacerlo. Todo de momento está hecho en un único archivo en Visual Studioi 2019.

He hecho un esquema boceto para que se entienda.


Ver zoom.

Se ha hecho un esquema de todas las opciones para tener una vista rápida y una posible facilidad de compresión.

Si nada más ejecutar el programa o aplicación, pulso Enter, muestra las opciones aue son A, B y C, señalo Salir, pulso Enter vuelve al reloj, como debe ser, así susecibamente. Hasta ahí todo bien.

El problema es cuando estoy en la opción indicada aquí.

Lo único que me falla, si voy a la opción C-1, le doy salir, al llegar a la opción principal que pone:

Citar
  Opción A.  
   Opción B.
 > Opción C.


Se me pone la flecha marcadore de opciónes siempre en Opción A, no se me guarda en la última opción seleccionada. Debo corregir esto, ya sería con una variable para memorizarlo.

Dejo el código hehco hasta el momento.

Código C#:
Código
  1. using System;
  2.  
  3. namespace Menu_consola_18_cs
  4. {
  5.    class Program
  6.    {
  7.        static void Main(string[] args)
  8.        {
  9.            Console.Title = "Menú de opciones";
  10.  
  11.            // Tamaño ventana consola.
  12.            // X anchura.
  13.            Console.WindowWidth = 20;
  14.  
  15.            // Y altura.
  16.            Console.WindowHeight = 5;
  17.  
  18.            // Oculto el cursor.
  19.            Console.CursorVisible = false;
  20.  
  21.            // Fondo verde.
  22.            Console.BackgroundColor = ConsoleColor.Green;
  23.  
  24.            // Letras negras.
  25.            Console.ForegroundColor = ConsoleColor.Black;
  26.  
  27.            MenuPrincipal();
  28.        }
  29.  
  30.        #region Menú principal.
  31.        public static void MenuPrincipal()
  32.        {
  33.            // Almacena la tecla pulsada en la variable.
  34.            ConsoleKey teclaInicial;
  35.  
  36.            // Limpiar pantalla.
  37.            Console.Clear();
  38.  
  39.            // Posición del cursor del título del MENÚ PRINCIPAL.
  40.            Console.SetCursorPosition(0, 0);
  41.  
  42.            // Título.
  43.            Console.Write("   MENÚ PRINCIPAL   ");
  44.  
  45.            // Pocisión de la hora.
  46.            Console.SetCursorPosition(4, 2);
  47.  
  48.            // Formato numérico dd/MM/yyyy.
  49.            Console.Write(DateTime.Now.ToString("ddd dd MMM"));
  50.  
  51.            // Almacena en la variable una tecla pulsada.
  52.            teclaInicial = Console.ReadKey(true).Key;
  53.  
  54.            // ¿Haz pulsado la tecla Enter?
  55.            if (teclaInicial == ConsoleKey.Enter)
  56.            {
  57.                // Sí. Se ejecuta esta función.
  58.                MenuOpciones();
  59.            }
  60.        }
  61.        #endregion
  62.  
  63.        #region Menú de opciones principales.
  64.        public static void MenuOpciones()
  65.        {
  66.            // Contador de teclas y navegador.
  67.            int opcion = 0;
  68.  
  69.            // Capturar tecla para luego validar.
  70.            ConsoleKey tecla;
  71.  
  72.            while (true)
  73.            {
  74.                //******************************************************************
  75.                // Dibujo el menú principal.
  76.  
  77.                // Limpiar pantalla.
  78.                Console.Clear();
  79.  
  80.                switch (opcion)
  81.                {
  82.                    case 0:
  83.                        Console.SetCursorPosition(0, 0);
  84.                        Console.Write("> Opción A.         ");
  85.                        Console.SetCursorPosition(0, 1);
  86.                        Console.Write("  Opción B.         ");
  87.                        Console.SetCursorPosition(0, 2);
  88.                        Console.Write("  Opción C.         ");
  89.                        Console.SetCursorPosition(0, 3);
  90.                        Console.Write("  Salir.            ");
  91.                        break;
  92.                    case 1:
  93.                        Console.SetCursorPosition(0, 0);
  94.                        Console.Write("  Opción A.         ");
  95.                        Console.SetCursorPosition(0, 1);
  96.                        Console.Write("> Opción B.         ");
  97.                        Console.SetCursorPosition(0, 2);
  98.                        Console.Write("  Opción C.         ");
  99.                        Console.SetCursorPosition(0, 3);
  100.                        Console.Write("  Salir.            ");
  101.                        break;
  102.                    case 2:
  103.                        Console.SetCursorPosition(0, 0);
  104.                        Console.Write("  Opción A.         ");
  105.                        Console.SetCursorPosition(0, 1);
  106.                        Console.Write("  Opción B.         ");
  107.                        Console.SetCursorPosition(0, 2);
  108.                        Console.Write("> Opción C.         ");
  109.                        Console.SetCursorPosition(0, 3);
  110.                        Console.Write("  Salir.            ");
  111.                        break;
  112.                    case 3:
  113.                        Console.SetCursorPosition(0, 0);
  114.                        Console.Write("  Opción A.         ");
  115.                        Console.SetCursorPosition(0, 1);
  116.                        Console.Write("  Opción B.         ");
  117.                        Console.SetCursorPosition(0, 2);
  118.                        Console.Write("  Opción C.         ");
  119.                        Console.SetCursorPosition(0, 3);
  120.                        Console.Write("> Salir.            ");
  121.                        break;
  122.                    default:
  123.                        Console.Write("Fuera de rango.     ");
  124.                        break;
  125.                }
  126.  
  127.                // Fin de pintar el menú principal.
  128.                //******************************************************************
  129.  
  130.                // Leer tecla ingresada por el usuario.
  131.                tecla = Console.ReadKey(true).Key;
  132.  
  133.                // Validar el tipo de tecla.
  134.                if (tecla == ConsoleKey.Enter)
  135.                {
  136.                    switch (opcion)
  137.                    {
  138.                        case 0:
  139.                            OpcionA();
  140.                            break;
  141.                        case 1:
  142.                            OpcionB();
  143.                            break;
  144.                        case 2:
  145.                            OpcionC();
  146.                            break;
  147.                        case 3:
  148.                            MenuPrincipal();
  149.                            break;
  150.                        default:
  151.                            break;
  152.                    }
  153.                }
  154.  
  155.                // Flecha abajo del teclado.
  156.                if (tecla == ConsoleKey.DownArrow)
  157.                {
  158.                    opcion++;
  159.                }
  160.  
  161.                // Flecha arriba del teclado.
  162.                if (tecla == ConsoleKey.UpArrow)
  163.                {
  164.                    opcion--;
  165.                }
  166.  
  167.                // Si está en la última opción del menú, salta a la primera.
  168.                if (opcion > 3)
  169.                {
  170.                    opcion = 0;
  171.                }
  172.  
  173.                // Si está en la primera posición del menú, salta a la última.
  174.                if (opcion < 0)
  175.                {
  176.                    opcion = 3;
  177.                }
  178.            }
  179.        }
  180.        #endregion
  181.  
  182.        #region Opción A (0).
  183.        public static void OpcionA()
  184.        {
  185.            ConsoleKey teclaOpcionA;
  186.            Console.Clear();
  187.            do
  188.            {
  189.                Console.SetCursorPosition(0, 0);
  190.                Console.WriteLine("Estás en Opción A.");
  191.                Console.SetCursorPosition(0, 2);
  192.                Console.WriteLine("Pulse Enter para");
  193.                Console.SetCursorPosition(0, 3);
  194.                Console.WriteLine("Salir.");
  195.  
  196.                // Almacena el teclado pulsado en la variable teclaSubMenuA.
  197.                teclaOpcionA = Console.ReadKey(true).Key;
  198.  
  199.            } while (teclaOpcionA != ConsoleKey.Enter);
  200.        }
  201.        #endregion
  202.  
  203.        #region Opción B (1).
  204.        public static void OpcionB()
  205.        {
  206.            // Contador de teclas y navegador.
  207.            int opcionB = 0;
  208.  
  209.            // Capturar tecla para luego validar.
  210.            ConsoleKey teclaOpcionB;
  211.  
  212.            while (true)
  213.            {
  214.                switch (opcionB)
  215.                {
  216.                    case 0:
  217.                        Console.SetCursorPosition(0, 0);
  218.                        Console.WriteLine("Estás en Opción B.  ");
  219.                        Console.SetCursorPosition(0, 1);
  220.                        Console.WriteLine("> SubOpción B-1.    ");
  221.                        Console.SetCursorPosition(0, 2);
  222.                        Console.WriteLine("  SubOpción B-2     ");
  223.                        Console.SetCursorPosition(0, 3);
  224.                        Console.WriteLine("  Salir.            ");
  225.                        break;
  226.                    case 1:
  227.                        Console.SetCursorPosition(0, 0);
  228.                        Console.WriteLine("Estás en Opción B.  ");
  229.                        Console.SetCursorPosition(0, 1);
  230.                        Console.WriteLine("  SubOpción B-1.    ");
  231.                        Console.SetCursorPosition(0, 2);
  232.                        Console.WriteLine("> SubOpción B-2     ");
  233.                        Console.SetCursorPosition(0, 3);
  234.                        Console.WriteLine("  Salir.            ");
  235.                        break;
  236.                    case 2:
  237.                        Console.SetCursorPosition(0, 0);
  238.                        Console.WriteLine("Estás en Opción B.  ");
  239.                        Console.SetCursorPosition(0, 1);
  240.                        Console.WriteLine("  SubOpción B-1.    ");
  241.                        Console.SetCursorPosition(0, 2);
  242.                        Console.WriteLine("  SubOpción B-2     ");
  243.                        Console.SetCursorPosition(0, 3);
  244.                        Console.WriteLine("> Salir.            ");
  245.                        break;
  246.                    default:
  247.                        Console.Write("Fuera de rango.     ");
  248.                        break;
  249.                }
  250.  
  251.                // Leer tecla ingresada por el usuario.
  252.                teclaOpcionB = Console.ReadKey(true).Key;
  253.  
  254.                // Validar el tipo de tecla.
  255.                if (teclaOpcionB == ConsoleKey.Enter)
  256.                {
  257.                    switch (opcionB)
  258.                    {
  259.                        case 0:
  260.                            OpcionB1();
  261.                            break;
  262.                        case 1:
  263.                            OpcionB2();
  264.                            break;
  265.                        case 2:
  266.                            MenuOpciones();
  267.                            break;
  268.                        default:
  269.                            Console.Write("Fuera de rango.     ");
  270.                            break;
  271.                    }
  272.                }
  273.  
  274.                if (teclaOpcionB == ConsoleKey.DownArrow)
  275.                {
  276.                    opcionB++;
  277.                }
  278.  
  279.                if (teclaOpcionB == ConsoleKey.UpArrow)
  280.                {
  281.                    opcionB--;
  282.                }
  283.  
  284.                // Si está en la última opción, salta a la primera.
  285.                if (opcionB > 2)
  286.                {
  287.                    opcionB = 0;
  288.                }
  289.  
  290.                // Si está en la primera posición, salta a la última.
  291.                if (opcionB < 0)
  292.                {
  293.                    opcionB = 2;
  294.                }
  295.            }
  296.        }
  297.  
  298.        #endregion
  299.  
  300.        #region Opcion B-1.
  301.        public static void OpcionB1()
  302.        {
  303.            ConsoleKey teclaOpcionB1;
  304.            Console.Clear();
  305.            do
  306.            {
  307.                Console.SetCursorPosition(0, 0);
  308.                Console.WriteLine("Estás en Opción B-1.");
  309.                Console.SetCursorPosition(0, 2);
  310.                Console.WriteLine("Pulse Enter para    ");
  311.                Console.SetCursorPosition(0, 3);
  312.                Console.WriteLine("volver atrás.       ");
  313.  
  314.                // Almacena el teclado pulsado en la variable teclaSubMenuA.
  315.                teclaOpcionB1 = Console.ReadKey(true).Key;
  316.  
  317.            } while (teclaOpcionB1 != ConsoleKey.Enter);
  318.        }
  319.        #endregion
  320.  
  321.        #region Opcion B-2.
  322.        public static void OpcionB2()
  323.        {
  324.            ConsoleKey teclaOpcionB2;
  325.            Console.Clear();
  326.            do
  327.            {
  328.                Console.SetCursorPosition(0, 0);
  329.                Console.WriteLine("Estás en Opción B-2.");
  330.                Console.SetCursorPosition(0, 2);
  331.                Console.WriteLine("Pulse Enter para    ");
  332.                Console.SetCursorPosition(0, 3);
  333.                Console.WriteLine("volver atrás.       ");
  334.  
  335.                // Almacena el teclado pulsado en la variable teclaSubMenuA.
  336.                teclaOpcionB2 = Console.ReadKey(true).Key;
  337.  
  338.            } while (teclaOpcionB2 != ConsoleKey.Enter);
  339.        }
  340.        #endregion
  341.  
  342.        #region Opción C (2).
  343.        public static void OpcionC()
  344.        {
  345.            // Contador de teclas y navegador.
  346.            int opcionC = 0;
  347.  
  348.            // Capturar tecla para luego validar.
  349.            ConsoleKey teclaOpcionC;
  350.            Console.Clear();
  351.  
  352.            while(true)
  353.            {
  354.                switch (opcionC)
  355.                {
  356.                    case 0:
  357.                        Console.SetCursorPosition(0, 0);
  358.                        Console.WriteLine("Estás en Opción C.  ");
  359.                        Console.SetCursorPosition(0, 1);
  360.                        Console.WriteLine("> Color 1.          ");
  361.                        Console.SetCursorPosition(0, 2);
  362.                        Console.WriteLine("  Color 2.          ");
  363.                        Console.SetCursorPosition(0, 3);
  364.                        Console.WriteLine("  Opción C-1.       ");
  365.                        break;
  366.                    case 1:
  367.                        Console.SetCursorPosition(0, 0);
  368.                        Console.WriteLine("Estás en Opción C.  ");
  369.                        Console.SetCursorPosition(0, 1);
  370.                        Console.WriteLine("  Color 1.          ");
  371.                        Console.SetCursorPosition(0, 2);
  372.                        Console.WriteLine("> Color 2.          ");
  373.                        Console.SetCursorPosition(0, 3);
  374.                        Console.WriteLine("  Opción C-1.       ");
  375.                        break;
  376.                    case 2:
  377.                        Console.SetCursorPosition(0, 0);
  378.                        Console.WriteLine("Estás en Opción C.  ");
  379.                        Console.SetCursorPosition(0, 1);
  380.                        Console.WriteLine("  Color 1.          ");
  381.                        Console.SetCursorPosition(0, 2);
  382.                        Console.WriteLine("  Color 2.          ");
  383.                        Console.SetCursorPosition(0, 3);
  384.                        Console.WriteLine("> Opción C-1.       ");
  385.                        break;
  386.                    case 3:
  387.                        Console.SetCursorPosition(0, 0);
  388.                        Console.WriteLine("> Color 3.          ");
  389.                        Console.SetCursorPosition(0, 1);
  390.                        Console.WriteLine("  Color 4.          ");
  391.                        Console.SetCursorPosition(0, 2);
  392.                        Console.WriteLine("  Color 5.          ");
  393.                        Console.SetCursorPosition(0, 3);
  394.                        Console.WriteLine("  Salir.            ");
  395.                        break;
  396.                    case 4:
  397.                        Console.SetCursorPosition(0, 0);
  398.                        Console.WriteLine("  Color 3.          ");
  399.                        Console.SetCursorPosition(0, 1);
  400.                        Console.WriteLine("> Color 4.          ");
  401.                        Console.SetCursorPosition(0, 2);
  402.                        Console.WriteLine("  Color 5.          ");
  403.                        Console.SetCursorPosition(0, 3);
  404.                        Console.WriteLine("  Salir.            ");
  405.                        break;
  406.                    case 5:
  407.                        Console.SetCursorPosition(0, 0);
  408.                        Console.WriteLine("  Color 3.          ");
  409.                        Console.SetCursorPosition(0, 1);
  410.                        Console.WriteLine("  Color 4.          ");
  411.                        Console.SetCursorPosition(0, 2);
  412.                        Console.WriteLine("> Color 5.          ");
  413.                        Console.SetCursorPosition(0, 3);
  414.                        Console.WriteLine("  Salir.            ");
  415.                        break;
  416.                    case 6:
  417.                        Console.SetCursorPosition(0, 0);
  418.                        Console.WriteLine("  Color 3.          ");
  419.                        Console.SetCursorPosition(0, 1);
  420.                        Console.WriteLine("  Color 4.          ");
  421.                        Console.SetCursorPosition(0, 2);
  422.                        Console.WriteLine("  Color 5.          ");
  423.                        Console.SetCursorPosition(0, 3);
  424.                        Console.WriteLine("> Salir.            ");
  425.                        break;
  426.  
  427.                    default:
  428.                        Console.Write("Fuera de rango.     ");
  429.                        break;
  430.                }
  431.  
  432.                // Leer tecla ingresada por el usuario.
  433.                teclaOpcionC = Console.ReadKey(true).Key;
  434.  
  435.                // Validar el tipo de tecla.
  436.                if (teclaOpcionC == ConsoleKey.Enter)
  437.                {
  438.                    switch (opcionC)
  439.                    {
  440.                        case 0:
  441.                            // Fondo azul.
  442.                            Console.BackgroundColor = ConsoleColor.Blue;
  443.  
  444.                            // Letras blancas.
  445.                            Console.ForegroundColor = ConsoleColor.White;
  446.                            break;
  447.                        case 1:
  448.                            // Fondo verde.
  449.                            Console.BackgroundColor = ConsoleColor.Green;
  450.  
  451.                            // Letras negras.
  452.                            Console.ForegroundColor = ConsoleColor.Black;
  453.                            break;
  454.                        case 2:
  455.                            OpcionC1();
  456.                            break;
  457.                        case 3:
  458.                            // Fondo negro.
  459.                            Console.BackgroundColor = ConsoleColor.Black;
  460.  
  461.                            // Letras rojo.
  462.                            Console.ForegroundColor = ConsoleColor.Red;
  463.                            break;
  464.                        case 4:
  465.                            // Fondo negro.
  466.                            Console.BackgroundColor = ConsoleColor.Black;
  467.  
  468.                            // Letras rojo.
  469.                            Console.ForegroundColor = ConsoleColor.Yellow;
  470.                            break;
  471.                        case 5:
  472.                            // Fondo negro.
  473.                            Console.BackgroundColor = ConsoleColor.Red;
  474.  
  475.                            // Letras rojo.
  476.                            Console.ForegroundColor = ConsoleColor.DarkRed;
  477.                            break;
  478.                        case 6:
  479.                            MenuOpciones();
  480.                            break;
  481.                        default:
  482.                            Console.Write("Fuera de rango.     ");
  483.                            break;
  484.                    }
  485.                }
  486.  
  487.                if (teclaOpcionC == ConsoleKey.DownArrow)
  488.                {
  489.                    opcionC++;
  490.                }
  491.  
  492.                if (teclaOpcionC == ConsoleKey.UpArrow)
  493.                {
  494.                    opcionC--;
  495.                }
  496.  
  497.                // Si está en la última opción, salta a la primera.
  498.                if (opcionC > 6)
  499.                {
  500.                    opcionC = 0;
  501.                }
  502.  
  503.                // Si está en la primera posición, salta a la última.
  504.                if (opcionC < 0)
  505.                {
  506.                    opcionC = 6;
  507.                }
  508.            }
  509.        }
  510.        #endregion
  511.  
  512.        #region OpcionC-1.
  513.        public static void OpcionC1()
  514.        {
  515.            // Contador de teclas y navegador.
  516.            int opcionC1 = 0;
  517.  
  518.            // Capturar tecla para luego validar.
  519.            ConsoleKey teclaOpcionC1;
  520.            Console.Clear();
  521.  
  522.            while(true)
  523.            {
  524.                Console.Clear();
  525.  
  526.                switch (opcionC1)
  527.                {
  528.                    case 0:
  529.                        Console.SetCursorPosition(0, 0);
  530.                        Console.WriteLine("Estás en Opción C-1.");
  531.                        Console.SetCursorPosition(0, 2);
  532.                        Console.WriteLine("  SI");
  533.                        Console.SetCursorPosition(16, 2);
  534.                        Console.WriteLine("> NO");
  535.                        break;
  536.                    case 1:
  537.                        Console.SetCursorPosition(0, 0);
  538.                        Console.WriteLine("Estás en Opción C-1.");
  539.                        Console.SetCursorPosition(0, 2);
  540.                        Console.WriteLine("> SI");
  541.                        Console.SetCursorPosition(16, 2);
  542.                        Console.WriteLine("  NO");
  543.                        break;
  544.                    default:
  545.                        Console.Write("Fuera de rango.     ");
  546.                        break;
  547.                }
  548.  
  549.                // Leer tecla ingresada por el usuario.
  550.                teclaOpcionC1 = Console.ReadKey(true).Key;
  551.  
  552.                // Validar el tipo de tecla.
  553.                if (teclaOpcionC1 == ConsoleKey.Enter)
  554.                {
  555.                    switch (opcionC1)
  556.                    {
  557.                        case 0:
  558.                            MenuPrincipal();
  559.                            Console.Clear();
  560.                            break;
  561.                        case 1:
  562.                            OpcionSI();
  563.                            break;
  564.                        default:
  565.                            Console.Write("Fuera de rango.     ");
  566.                            break;
  567.                    }
  568.                }
  569.  
  570.                // Flecha derecha.
  571.                if (teclaOpcionC1 == ConsoleKey.RightArrow)
  572.                {
  573.                    opcionC1++;
  574.                }
  575.  
  576.                // Flecha izquierda.
  577.                if (teclaOpcionC1 == ConsoleKey.LeftArrow)
  578.                {
  579.                    opcionC1--;
  580.                }
  581.  
  582.                // Si está en la última opción, salta a la primera.
  583.                if (opcionC1 > 1)
  584.                {
  585.                    opcionC1 = 0;
  586.                }
  587.  
  588.                // Si está en la primera posición, salta a la última.
  589.                if (opcionC1 < 0)
  590.                {
  591.                    opcionC1 = 1;
  592.                }
  593.            }
  594.        }
  595.        #endregion
  596.  
  597.        #region opcionSI del sub menú C-1.
  598.        public static void OpcionSI()
  599.        {
  600.            ConsoleKey teclaOpcionB1;
  601.            Console.Clear();
  602.            do
  603.            {
  604.                Console.SetCursorPosition(0, 0);
  605.                Console.WriteLine("Estás en Opción SÍ.");
  606.                Console.SetCursorPosition(0, 2);
  607.                Console.WriteLine("Pulse Enter para    ");
  608.                Console.SetCursorPosition(0, 3);
  609.                Console.WriteLine("volver atrás.       ");
  610.  
  611.                // Almacena el teclado pulsado en la variable teclaOpciónB1.
  612.                teclaOpcionB1 = Console.ReadKey(true).Key;
  613.  
  614.            } while (teclaOpcionB1 != ConsoleKey.Enter);
  615.        }
  616.        #endregion
  617.    }
  618. }

Se que se podrá hacer mucho mejor y sin fallos como estos. No se quedará así, sino que mi idea principal, es coger el truco que se pueda crear menús y submenús que se pueda hacer de forma muy sencilla.

Dejo clarqo eu solo hacerlo que funcione con botones flecha arriba, abajo, derecha, izquierda y Enter (Escape solo para salir si estás en la ventana principal).

Saludos.
119  Informática / Electrónica / Controlar Led 13 de Arduino desde email en: 16 Junio 2019, 19:14 pm
Hola:

Ver imagen.

Hice un código con C# de la consola en el cual puedes apagar y encender el famoso y popular Led 13. Uso el LCD Keypad Shield para ver en pantalla los mensajes a parte desde el PC.

El código es una versión alfa pero funcional. Puede recibir códigos desde un correo electrónico pero no puede ejecutar comandos desde el teclado ni directamente desde Arduino, voy por parte.

Les dejo el código para que hagan pruebas y comente sus impresiones sobre lo que he hecho para mejorarlo. Si, está en modo consola, má adelante se hará con Windows Form y WPF, a parte de C#, también con Visual Basic .net y Visual C++.

Puedes enviar con tu movil (o celular) en cualquier parte y enviar comandos.

Dejo claroue tiene sistema de filtros de los email, solo acepta comandos de los email que hayas filtrado, de lo contrario cualquiera te puede cerrar o bajar las persianas de tu casa, ajjajajajjaja.

Recuerdo que la aplicación es alfa, falta codear que de respuesta desde el P hacia el movil el estado de las persianas, ventiladores o luces de la casa como están y si realmente se ha ejecutado dicha orden.

A descargar si no lo tienen, Visual Studio Community gratuito.

Código Arduino:
Código:
#include <LiquidCrystal.h>

// Inicializa la librería con sus pines indicados.
// RS, RW, Enable, D4, D5, D6, D7.
LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);
// LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Pin 10 para saber que es luz de fondo.
const byte LuzFondo = 10;

const byte Led = 13;   // Declaramos la variable pin del Led.
char caracter;
String comando;

void setup()
{
  pinMode(Led, OUTPUT);  // Inicializa el pin del LED como salida:
  Serial.begin(115200);     // Puerto serie 115200 baudios.
  lcd.begin(16, 2);         // Formato de pantalla.
  lcd.clear();      // Borra la pantalla y su posición superior izquierda.
  lcd.print("    Arduino     ");
  delay(1000);
}

void loop()
{
  /*
    Voy leyendo carácter a carácter lo que se recibe por el canal serie
    (mientras llegue algún dato allí), y los voy concatenando uno tras otro
    en una cadena. En la práctica, si usamos el "Serial monitor" el bucle while
    acabará cuando pulsamos Enter. El delay es conveniente para no saturar el
    canal serie y que la concatenación se haga de forma ordenada.
  */
  while (Serial.available() > 0)
  {
    caracter = Serial.read();
    comando.concat(caracter);
    delay(10);
  }

  /*
    Una vez ya tengo la cadena "acabada", compruebo su valor y hago que
    la placa Arduino reacciones según sea este. Aquí podríamos hacer lo
    que quisiéramos: si el comando es "tal", enciende un Led, si es cual,
    mueve un motor... y así.
  */

  // Si los carácteres es recibido y verdadero.
  if (comando.equals("Luz_ON") == true)
  {
    digitalWrite(Led, HIGH); // Enciende el Led 13.
    Serial.write("ON - Led encendido.");    // Envía este mensaje al PC.
    lcd.setCursor(0, 1);
    lcd.print("Luz ON.         "); // Mostrar en el LCD.
  }


  if (comando.equals("Luz_OFF") == true)
  {
    digitalWrite(Led, LOW); // Apaga el Led 13.
    Serial.write("OFF - Led apagado. ");  // Envía este mensaje al PC.
    lcd.setCursor(0, 1);
    lcd.print("Luz OFF.        "); // Mostrar en el LCD.
  }

  // Limpiamos la cadena para volver a recibir el siguiente comando.
  comando = "";
}

Luz_OFF // Apaga el Led de Arduino.

Luz_ON // Enciende el Led de Arduino.

Salir. // Sale del programa C# o se cierra.

Son solo tres comandos. Esos comandos indicado arriba solo lo pones en el email en Asuntos y lo detecta. En mensaje no tienes que poner nada, los lee y muestra en pantalla pero nada más.

Código C#:
Código
  1. // Activar / desactivar Acceso de aplicaciones poco seguras en Google.
  2. // https://myaccount.google.com/lesssecureapps
  3.  
  4. using System;
  5. using System.Collections.Generic;
  6. using OpenPop.Pop3;
  7. using OpenPop.Mime;
  8. using System.Text.RegularExpressions;
  9. using System.IO.Ports;
  10. using System.Text;
  11. using System.Timers;
  12.  
  13. namespace Recibir_email_enviar_arduino_01
  14. {
  15.    class Program
  16.    {
  17.        // Disparador de eventos del timer. Dispara cada cierto tiempo por el timer.
  18.        public static void DisparadorEventosTimer(object source, ElapsedEventArgs e)
  19.        {
  20.            //ConsoleKey tecla;
  21.            string comando = "";
  22.  
  23.            ConnectPop3 oC = new ConnectPop3();
  24.  
  25.            List<OpenPop.Mime.Message> lstMessages = oC.GetMessages();
  26.  
  27.  
  28.            if (lstMessages != null)
  29.            {
  30.  
  31.                foreach (var oMessage in lstMessages)
  32.                {
  33.                    Console.ForegroundColor = ConsoleColor.White;
  34.                    Console.WriteLine("EMAIL DE: ");
  35.                    Console.ForegroundColor = ConsoleColor.Gray;
  36.  
  37.                    string emailDesde = oMessage.Headers.From.ToString();
  38.  
  39.                    // Expresión regular detectar dirección email.
  40.                    Regex rx = new Regex(@"<(.*?)>");
  41.                    //Regex rx = new Regex(@"^([da-z_.-]+)@([da-z.-]+).([a-z.]{2,6})$");
  42.                    // Guarda la dirección email en la variable "emailCompleto".
  43.                    string emailCompleto = rx.Match(emailDesde).Groups[1].Value;
  44.                    // Muestra solo la dirección del email.
  45.                    Console.WriteLine(emailCompleto);
  46.  
  47.                    // ¿Son email filtrados? Sí, ejecuta las intrucciones necesarios para leer asunto y mensajes.
  48.                    if ((emailCompleto == "metaconta@gmail.com") || (emailCompleto == "celltium@gmail.com"))
  49.                    {
  50.                        Console.WriteLine("{0} a pasado el filtro: ", emailCompleto);
  51.  
  52.                        Console.ForegroundColor = ConsoleColor.White;
  53.                        Console.WriteLine();
  54.                        Console.WriteLine("ASUNTO: ");
  55.                        Console.ForegroundColor = ConsoleColor.Gray;
  56.                        Console.WriteLine(oMessage.Headers.Subject + "\n"); // Asunto.
  57.                        comando = oMessage.Headers.Subject; // Guarda el asunto en la variable "comando".
  58.                        Console.ForegroundColor = ConsoleColor.White;
  59.                        Console.WriteLine();
  60.                        Console.WriteLine("MENSAJE: ");
  61.                        Console.ForegroundColor = ConsoleColor.Gray;
  62.                        Console.WriteLine();
  63.  
  64.                        // ¿Es texto sin formato? Sí.
  65.                        // if (oMessage.MessagePart.IsText == true)
  66.                        if (oMessage.MessagePart.IsText)
  67.                        {
  68.                            Console.WriteLine("Texto sin formato.");
  69.                            Console.WriteLine(oMessage.MessagePart.GetBodyAsText());
  70.                            Console.WriteLine("-------------------------------------------");
  71.                        }
  72.                        // No. Texto con formato.
  73.                        else
  74.                        {
  75.                            Console.WriteLine("Texto con formato.");
  76.  
  77.                            // Encuentra el primer texto sin formato.
  78.                            MessagePart plainTextPart = oMessage.FindFirstPlainTextVersion();
  79.                            if (plainTextPart != null)
  80.                            {
  81.                                // El mensaje tenía una versión de texto sin formato.
  82.                                Console.WriteLine(plainTextPart.GetBodyAsText());
  83.                            }
  84.                            else
  85.                            {
  86.                                // Trate de encontrar un cuerpo para mostrar en algunas de las otras versiones de texto.
  87.                                List<MessagePart> textVersions = oMessage.FindAllTextVersions();
  88.                                if (textVersions.Count >= 1)
  89.                                {
  90.                                    Console.WriteLine(textVersions[0].GetBodyAsText());
  91.                                }
  92.                                else
  93.                                {
  94.                                    Console.WriteLine("<<OpenPop>> Cannot find a text version body in this message to show <<OpenPop>>");
  95.                                }
  96.                            }
  97.                        }
  98.                    }
  99.  
  100.                    // No. Entonces,ignorará los email no filtrados.
  101.                    else
  102.                    {
  103.                        Console.WriteLine("No ha pasado el filtro y no se leerá ningún email.");
  104.                    }
  105.                }
  106.            }
  107.            Console.ForegroundColor = ConsoleColor.Yellow; // Letras amarillas.
  108.            Console.WriteLine();
  109.            Console.WriteLine("FIN DEL PROGRAMA.");
  110.            //Console.ReadKey(); // Pulse cualquier tecla para salir.
  111.            Console.ForegroundColor = ConsoleColor.Gray;
  112.  
  113.            // Cree un nuevo objeto SerialPort con la configuración predeterminada.
  114.            SerialPort Puerto_serie = new SerialPort("COM4")
  115.            {
  116.                BaudRate = 115200,
  117.                Parity = Parity.None,
  118.                StopBits = StopBits.One,
  119.                DataBits = 8,
  120.                Handshake = Handshake.None,
  121.                RtsEnable = true,
  122.  
  123.                // Establecer los tiempos de espera de lectura / escritura.
  124.                ReadTimeout = 500, // Milisegundos.
  125.                WriteTimeout = 500
  126.            };
  127.  
  128.            // Detecta cualquier dato recibido.
  129.            Puerto_serie.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
  130.  
  131.            Puerto_serie.Open(); // Abrir puerto.
  132.  
  133.            // ConsoleKey tecla;
  134.            Console.WriteLine("Pulse tecla 1 para encender y 2 para apagar:");
  135.  
  136.            do
  137.            {
  138.  
  139.                switch (comando)
  140.                {
  141.                    case "Luz_ON":
  142.                        EncenderLuz();
  143.                        break;
  144.  
  145.                    case "Luz_OFF":
  146.                        ApagarLuz();
  147.                        break;
  148.  
  149.                    case "Salir":
  150.                        Environment.Exit(1); // Salir de la consola.
  151.                        break;
  152.  
  153.                    default:
  154.                        Console.WriteLine("Esperando comandos válidos");
  155.                        break;
  156.                }
  157.  
  158.                //tecla = Console.ReadKey(true).Key; // Espera pulsación de teclas.
  159.  
  160.  
  161.  
  162.                //switch (tecla)
  163.                //{
  164.                //    case ConsoleKey.D1: // Tecla 1 del teclado estandar.
  165.                //    case ConsoleKey.NumPad1: // Tecla 1 del número del pad.
  166.                //        EncenderLuz();
  167.                //        break;
  168.  
  169.                //    case ConsoleKey.D2:
  170.                //    case ConsoleKey.NumPad2:
  171.                //        ApagarLuz();
  172.                //        break;
  173.  
  174.                //    default:
  175.                //        Console.WriteLine("Tecla el 1, el 2 y Escape para salir.");
  176.                //        break;
  177.                //}
  178.  
  179.                Puerto_serie.Close(); // Cerrar puerto.
  180.  
  181.            } while (comando == "salir"); // while (tecla != ConsoleKey.Escape); // Pulsa Escape para salir del menú.
  182.  
  183.            void EncenderLuz()
  184.            {
  185.                byte[] miBuffer1 = Encoding.ASCII.GetBytes("Luz_ON"); // Codificación ASCII y guarda en la variable array tipo byte.
  186.                Puerto_serie.Write(miBuffer1, 0, miBuffer1.Length); // Envía los datos del buffer todo su contenido.
  187.                Console.WriteLine("Comando \"Luz_ON\" enviado."); // Muestra en pantalla comandos enviado.
  188.            }
  189.  
  190.            void ApagarLuz()
  191.            {
  192.                byte[] miBuffer2 = Encoding.ASCII.GetBytes("Luz_OFF");
  193.                Puerto_serie.Write(miBuffer2, 0, miBuffer2.Length);
  194.                Console.WriteLine("Comando \"Luz_OFF\" enviado.");
  195.            }
  196.  
  197.            Console.WriteLine("Presione cualquier tecla para terminar...");
  198.            Console.WriteLine();
  199.            Console.ReadKey(); // Espera pulsar una tecla cualquiera.
  200.            Puerto_serie.Close(); // Cierra el puerto serie.
  201.        }
  202.  
  203.        static void Main(string[] args)
  204.        {
  205.            // Título de la ventana.
  206.            Console.Title = "Recibir e-mail con Consola C# y enviar al LCD de Arduino";
  207.  
  208.            // Tamaño ventana consola.
  209.            Console.WindowWidth = 80; // X. Ancho.
  210.            Console.WindowHeight = 40; // Y. Alto.
  211.  
  212.            // Cursor invisible.
  213.            Console.CursorVisible = false;
  214.  
  215.            // Título del programa.
  216.            Console.WriteLine("\t-----------------------------------------------------");
  217.            Console.WriteLine("\tRecibir Correo Electrónico y enviar al LCD de Arduino");
  218.            Console.WriteLine("\t-----------------------------------------------------");
  219.            Console.WriteLine();
  220.  
  221.            try
  222.            {
  223.                Timer miTimer = new Timer
  224.                {
  225.                    Enabled = true
  226.                };
  227.                miTimer.Elapsed += new ElapsedEventHandler(DisparadorEventosTimer);
  228.                miTimer.Interval = 5000; // Escaneo cada 5 segundos.
  229.                miTimer.Start(); // Activa el temporizador.
  230.  
  231.  
  232.                Console.ReadKey(); // Pulse cualquier tecla para salir.
  233.            }
  234.  
  235.            // Cualquier error mostrado en mensaje y de color rojo.
  236.            catch (Exception ex)
  237.            {
  238.                Console.ForegroundColor = ConsoleColor.Red;
  239.                Console.WriteLine();
  240.                Console.WriteLine(ex);
  241.                Console.ReadKey();
  242.            }
  243.  
  244.  
  245.        }
  246.  
  247.        // Detecta cualquier dato entrante.
  248.        private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
  249.        {
  250.            SerialPort sp = (SerialPort)sender;
  251.            string entradaDatos = sp.ReadExisting(); // Almacena los datos recibidos en la variable tipo string.
  252.            Console.WriteLine("Dato recibido desde Arduino: " + entradaDatos); // Muestra en pantalla los datos recibidos.
  253.        }
  254.    }
  255.  
  256.    public class ConnectPop3
  257.    {
  258.        public string email = "celltium@gmail.com";
  259.        public string contraseña = "g0923490xgh0945g450Xj4025g"; // Ficticio.
  260.        public int puerto = 995;
  261.        public bool usarSLL = true;
  262.        public string Hostame = "pop.gmail.com";
  263.  
  264.        public List<OpenPop.Mime.Message> GetMessages()
  265.        {
  266.            using (Pop3Client oClient = new Pop3Client())
  267.            {
  268.                oClient.Connect(Hostame, puerto, usarSLL);
  269.                oClient.Authenticate(email, contraseña);
  270.  
  271.                int messageCount = oClient.GetMessageCount();
  272.                List<OpenPop.Mime.Message> lstMessages = new List<OpenPop.Mime.Message>(messageCount);
  273.  
  274.                for (int i = messageCount; i > 0; i--)
  275.                {
  276.                    lstMessages.Add(oClient.GetMessage(i));
  277.                }
  278.  
  279.                return lstMessages;
  280.            }
  281.        }
  282.    }
  283. }
  284.  
Como no cabe en la web, lo pongo como descarga.

Los que los prueben, espero cualquier impresión.

Saludos.
120  Programación / .NET (C#, VB.NET, ASP) / Activar un timer cada cierto tiempo. en: 15 Junio 2019, 11:26 am
Hola:

Quiero usar un timer en modo consola C# para que lea cada cierto tiempo la bandeja de entrada de un correo.

Por ejemplo, he estado urgando con este código pero no se donde ponerlo siempre da errores.

Código
  1.                Timer miTimer = new Timer
  2.                {
  3.                    Enabled = true
  4.                };
  5.                miTimer.Elapsed += new ElapsedEventHandler(DisparadorEventosTimer);
  6.                miTimer.Interval = 60000; // 1 minuto.
  7.                miTimer.Start(); // Activa el temporizador.

En el evento debo poner en algún luegar para que lea el mensaje de entrada si hay algún mensje nuevo.

Código
  1.        public static void DisparadorEventosTimer(object source, ElapsedEventArgs e)
  2.        {
  3.            Console.Out.WriteLine("Evento: ");
  4.        }


El código del recibir corre electrónic lo ves justo debajo. Solo se actualiza al volver ejecutar la aplicación, cerrarla y vovler a ejecutar. Lo quiero automático, por cada minuto se active el timer, lea si hay mensajes nuevos sin tener que cerrar y ejecutar la aplicación.

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using OpenPop.Pop3;
  4. using OpenPop.Mime;
  5. using System.Text.RegularExpressions;
  6.  
  7. namespace Recibir_email_Consola_03_cs
  8. {
  9.    class Program
  10.    {
  11.        static void Main(string[] args)
  12.        {
  13.            // Título de la ventana.
  14.            Console.Title = "Recibir e-mail con Consola C#";
  15.  
  16.            // Tamaño ventana consola.
  17.            Console.WindowWidth = 80; // X. Ancho.
  18.            Console.WindowHeight = 40; // Y. Alto.
  19.  
  20.            // Cursor invisible.
  21.            Console.CursorVisible = false;
  22.  
  23.            // Título del programa.
  24.            Console.WriteLine("\t\t----------------------------------------");
  25.            Console.WriteLine("\t\t\tRecibir Correo Electrónico");
  26.            Console.WriteLine("\t\t----------------------------------------");
  27.            Console.WriteLine();
  28.  
  29.            try
  30.            {
  31.                ConnectPop3 oC = new ConnectPop3();
  32.  
  33.                List<OpenPop.Mime.Message> lstMessages = oC.GetMessages();
  34.  
  35.  
  36.                if (lstMessages != null)
  37.                {
  38.  
  39.                    foreach (var oMessage in lstMessages)
  40.                    {
  41.                        Console.ForegroundColor = ConsoleColor.White;
  42.                        Console.WriteLine("EMAIL DE: ");
  43.                        Console.ForegroundColor = ConsoleColor.Gray;
  44.  
  45.                        //string email = oMessage.Headers.ReturnPath.ToString();
  46.                        string email = oMessage.Headers.From.ToString();
  47.  
  48.                        // Expresión regular detectar dirección email.
  49.                        Regex rx = new Regex(@"<(.*?)>");
  50.                        //Regex rx = new Regex(@"");
  51.                        // Guarda la dirección email en la variable "emailCompleto".
  52.                        string emailCompleto = rx.Match(email).Groups[1].Value;
  53.                        // Muestra solo la dirección del email.
  54.                        Console.WriteLine(emailCompleto);
  55.  
  56.                        // ¿Son email filtrados? Sí, ejecuta las intrucciones necesarios para leer asunto y mensajes.
  57.                        if ((emailCompleto == "metaconta@gmail.com") ||  (emailCompleto == "celltium@gmail.com"))
  58.                        {
  59.                            Console.WriteLine("{0} a pasado el filtro: ", emailCompleto);
  60.  
  61.                            Console.ForegroundColor = ConsoleColor.White;
  62.                            Console.WriteLine();
  63.                            Console.WriteLine("ASUNTO: ");
  64.                            Console.ForegroundColor = ConsoleColor.Gray;
  65.                            Console.WriteLine(oMessage.Headers.Subject + "\n"); // Asunto.
  66.                            Console.ForegroundColor = ConsoleColor.White;
  67.                            Console.WriteLine();
  68.                            Console.WriteLine("MENSAJE: ");
  69.                            Console.ForegroundColor = ConsoleColor.Gray;
  70.  
  71.                            // ¿Es texto sin formato? Sí.
  72.                            // if (oMessage.MessagePart.IsText == true)
  73.                            if (oMessage.MessagePart.IsText)
  74.                            {
  75.                                Console.WriteLine("Texto sin formato.");
  76.                                Console.WriteLine(oMessage.MessagePart.GetBodyAsText());
  77.                            }
  78.                            // No. Texto con formato.
  79.                            else
  80.                            {
  81.                                Console.WriteLine("Texto con formato.");
  82.  
  83.                                // Encuentra el primer texto sin formato.
  84.                                MessagePart plainTextPart = oMessage.FindFirstPlainTextVersion();
  85.                                if (plainTextPart != null)
  86.                                {
  87.                                    // El mensaje tenía una versión de texto sin formato.
  88.                                    Console.WriteLine(plainTextPart.GetBodyAsText());
  89.                                }
  90.                                else
  91.                                {
  92.                                    // Trate de encontrar un cuerpo para mostrar en algunas de las otras versiones de texto.
  93.                                    List<MessagePart> textVersions = oMessage.FindAllTextVersions();
  94.                                    if (textVersions.Count >= 1)
  95.                                    {
  96.                                        Console.WriteLine(textVersions[0].GetBodyAsText());
  97.                                    }
  98.                                    else
  99.                                    {
  100.                                        Console.WriteLine("<<OpenPop>> Cannot find a text version body in this message to show <<OpenPop>>");
  101.                                    }
  102.                                }
  103.                            }
  104.                        }
  105.  
  106.                        // No. Entonces,ignorará los email no filtrados.
  107.                        else
  108.                        {
  109.                            Console.WriteLine("No ha pasado el filtro y no se leerá ningún email.");
  110.                        }          
  111.                    }
  112.                }
  113.                Console.ForegroundColor = ConsoleColor.Yellow; // Letras amarillas.
  114.                Console.WriteLine();
  115.                Console.WriteLine("FIN DEL PROGRAMA.");
  116.                Console.ReadKey(); // Pulse cualquier tecla para salir.
  117.            }
  118.  
  119.            // Cualquier error mostrado en mensaje y de color rojo.
  120.            catch (Exception ex)
  121.            {
  122.                Console.ForegroundColor = ConsoleColor.Red;
  123.                Console.WriteLine();
  124.                Console.WriteLine(ex);
  125.                Console.ReadKey();
  126.            }
  127.        }
  128.    }
  129.  
  130.    public class ConnectPop3
  131.    {
  132.        public string email = "celltium@gmail.com";
  133.        public string contraseña = "g0923490xgh0945g450Xj4025g"; // Ficcicio.
  134.        public int puerto = 995;
  135.        public bool usarSLL = true;
  136.        public string Hostame = "pop.gmail.com";
  137.  
  138.        public List<OpenPop.Mime.Message> GetMessages()
  139.        {
  140.            using (Pop3Client oClient = new Pop3Client())
  141.            {
  142.                oClient.Connect(Hostame, puerto, usarSLL);
  143.                oClient.Authenticate(email, contraseña);
  144.  
  145.                int messageCount = oClient.GetMessageCount();
  146.                List<OpenPop.Mime.Message> lstMessages = new List<OpenPop.Mime.Message>(messageCount);
  147.  
  148.                for (int i = messageCount; i > 0; i--)
  149.                {
  150.                    lstMessages.Add(oClient.GetMessage(i));
  151.                }
  152.  
  153.                return lstMessages;
  154.            }
  155.        }
  156.    }
  157. }
  158.  

¿Alguna idea?

;)
Páginas: 1 2 3 4 5 6 7 8 9 10 11 [12] 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ... 66
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines