// 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);
// 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;
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 } } }
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.
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.
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.
En la consola C# 2019 quiero hacer un menú con estas dimensiones.
Código
Console.Title="Menú de opciones";
// Tamaño ventana consola.
// X anchura.
Console.WindowWidth=20;
// Y altura.
Console.WindowHeight=5;
// Oculto el cursor.
Console.CursorVisible=false;
// Fondo verde.
Console.BackgroundColor= ConsoleColor.Green;
// Letras negras.
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.
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.
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
usingSystem;
namespace Menu_consola_18_cs
{
class Program
{
staticvoid Main(string[] args)
{
Console.Title="Menú de opciones";
// Tamaño ventana consola.
// X anchura.
Console.WindowWidth=20;
// Y altura.
Console.WindowHeight=5;
// Oculto el cursor.
Console.CursorVisible=false;
// Fondo verde.
Console.BackgroundColor= ConsoleColor.Green;
// Letras negras.
Console.ForegroundColor= ConsoleColor.Black;
MenuPrincipal();
}
#region Menú principal.
publicstaticvoid MenuPrincipal()
{
// Almacena la tecla pulsada en la variable.
ConsoleKey teclaInicial;
// Limpiar pantalla.
Console.Clear();
// Posición del cursor del título del MENÚ PRINCIPAL.
// Si está en la última opción del menú, salta a la primera.
if(opcion >3)
{
opcion =0;
}
// Si está en la primera posición del menú, salta a la última.
if(opcion <0)
{
opcion =3;
}
}
}
#endregion
#region Opción A (0).
publicstaticvoid OpcionA()
{
ConsoleKey teclaOpcionA;
Console.Clear();
do
{
Console.SetCursorPosition(0, 0);
Console.WriteLine("Estás en Opción A.");
Console.SetCursorPosition(0, 2);
Console.WriteLine("Pulse Enter para");
Console.SetCursorPosition(0, 3);
Console.WriteLine("Salir.");
// Almacena el teclado pulsado en la variable teclaSubMenuA.
teclaOpcionA = Console.ReadKey(true).Key;
}while(teclaOpcionA != ConsoleKey.Enter);
}
#endregion
#region Opción B (1).
publicstaticvoid OpcionB()
{
// Contador de teclas y navegador.
int opcionB =0;
// Capturar tecla para luego validar.
ConsoleKey teclaOpcionB;
while(true)
{
switch(opcionB)
{
case0:
Console.SetCursorPosition(0, 0);
Console.WriteLine("Estás en Opción B. ");
Console.SetCursorPosition(0, 1);
Console.WriteLine("> SubOpción B-1. ");
Console.SetCursorPosition(0, 2);
Console.WriteLine(" SubOpción B-2 ");
Console.SetCursorPosition(0, 3);
Console.WriteLine(" Salir. ");
break;
case1:
Console.SetCursorPosition(0, 0);
Console.WriteLine("Estás en Opción B. ");
Console.SetCursorPosition(0, 1);
Console.WriteLine(" SubOpción B-1. ");
Console.SetCursorPosition(0, 2);
Console.WriteLine("> SubOpción B-2 ");
Console.SetCursorPosition(0, 3);
Console.WriteLine(" Salir. ");
break;
case2:
Console.SetCursorPosition(0, 0);
Console.WriteLine("Estás en Opción B. ");
Console.SetCursorPosition(0, 1);
Console.WriteLine(" SubOpción B-1. ");
Console.SetCursorPosition(0, 2);
Console.WriteLine(" SubOpción B-2 ");
Console.SetCursorPosition(0, 3);
Console.WriteLine("> Salir. ");
break;
default:
Console.Write("Fuera de rango. ");
break;
}
// Leer tecla ingresada por el usuario.
teclaOpcionB = Console.ReadKey(true).Key;
// Validar el tipo de tecla.
if(teclaOpcionB == ConsoleKey.Enter)
{
switch(opcionB)
{
case0:
OpcionB1();
break;
case1:
OpcionB2();
break;
case2:
MenuOpciones();
break;
default:
Console.Write("Fuera de rango. ");
break;
}
}
if(teclaOpcionB == ConsoleKey.DownArrow)
{
opcionB++;
}
if(teclaOpcionB == ConsoleKey.UpArrow)
{
opcionB--;
}
// Si está en la última opción, salta a la primera.
if(opcionB >2)
{
opcionB =0;
}
// Si está en la primera posición, salta a la última.
if(opcionB <0)
{
opcionB =2;
}
}
}
#endregion
#region Opcion B-1.
publicstaticvoid OpcionB1()
{
ConsoleKey teclaOpcionB1;
Console.Clear();
do
{
Console.SetCursorPosition(0, 0);
Console.WriteLine("Estás en Opción B-1.");
Console.SetCursorPosition(0, 2);
Console.WriteLine("Pulse Enter para ");
Console.SetCursorPosition(0, 3);
Console.WriteLine("volver atrás. ");
// Almacena el teclado pulsado en la variable teclaSubMenuA.
teclaOpcionB1 = Console.ReadKey(true).Key;
}while(teclaOpcionB1 != ConsoleKey.Enter);
}
#endregion
#region Opcion B-2.
publicstaticvoid OpcionB2()
{
ConsoleKey teclaOpcionB2;
Console.Clear();
do
{
Console.SetCursorPosition(0, 0);
Console.WriteLine("Estás en Opción B-2.");
Console.SetCursorPosition(0, 2);
Console.WriteLine("Pulse Enter para ");
Console.SetCursorPosition(0, 3);
Console.WriteLine("volver atrás. ");
// Almacena el teclado pulsado en la variable teclaSubMenuA.
teclaOpcionB2 = Console.ReadKey(true).Key;
}while(teclaOpcionB2 != ConsoleKey.Enter);
}
#endregion
#region Opción C (2).
publicstaticvoid OpcionC()
{
// Contador de teclas y navegador.
int opcionC =0;
// Capturar tecla para luego validar.
ConsoleKey teclaOpcionC;
Console.Clear();
while(true)
{
switch(opcionC)
{
case0:
Console.SetCursorPosition(0, 0);
Console.WriteLine("Estás en Opción C. ");
Console.SetCursorPosition(0, 1);
Console.WriteLine("> Color 1. ");
Console.SetCursorPosition(0, 2);
Console.WriteLine(" Color 2. ");
Console.SetCursorPosition(0, 3);
Console.WriteLine(" Opción C-1. ");
break;
case1:
Console.SetCursorPosition(0, 0);
Console.WriteLine("Estás en Opción C. ");
Console.SetCursorPosition(0, 1);
Console.WriteLine(" Color 1. ");
Console.SetCursorPosition(0, 2);
Console.WriteLine("> Color 2. ");
Console.SetCursorPosition(0, 3);
Console.WriteLine(" Opción C-1. ");
break;
case2:
Console.SetCursorPosition(0, 0);
Console.WriteLine("Estás en Opción C. ");
Console.SetCursorPosition(0, 1);
Console.WriteLine(" Color 1. ");
Console.SetCursorPosition(0, 2);
Console.WriteLine(" Color 2. ");
Console.SetCursorPosition(0, 3);
Console.WriteLine("> Opción C-1. ");
break;
case3:
Console.SetCursorPosition(0, 0);
Console.WriteLine("> Color 3. ");
Console.SetCursorPosition(0, 1);
Console.WriteLine(" Color 4. ");
Console.SetCursorPosition(0, 2);
Console.WriteLine(" Color 5. ");
Console.SetCursorPosition(0, 3);
Console.WriteLine(" Salir. ");
break;
case4:
Console.SetCursorPosition(0, 0);
Console.WriteLine(" Color 3. ");
Console.SetCursorPosition(0, 1);
Console.WriteLine("> Color 4. ");
Console.SetCursorPosition(0, 2);
Console.WriteLine(" Color 5. ");
Console.SetCursorPosition(0, 3);
Console.WriteLine(" Salir. ");
break;
case5:
Console.SetCursorPosition(0, 0);
Console.WriteLine(" Color 3. ");
Console.SetCursorPosition(0, 1);
Console.WriteLine(" Color 4. ");
Console.SetCursorPosition(0, 2);
Console.WriteLine("> Color 5. ");
Console.SetCursorPosition(0, 3);
Console.WriteLine(" Salir. ");
break;
case6:
Console.SetCursorPosition(0, 0);
Console.WriteLine(" Color 3. ");
Console.SetCursorPosition(0, 1);
Console.WriteLine(" Color 4. ");
Console.SetCursorPosition(0, 2);
Console.WriteLine(" Color 5. ");
Console.SetCursorPosition(0, 3);
Console.WriteLine("> Salir. ");
break;
default:
Console.Write("Fuera de rango. ");
break;
}
// Leer tecla ingresada por el usuario.
teclaOpcionC = Console.ReadKey(true).Key;
// Validar el tipo de tecla.
if(teclaOpcionC == ConsoleKey.Enter)
{
switch(opcionC)
{
case0:
// Fondo azul.
Console.BackgroundColor= ConsoleColor.Blue;
// Letras blancas.
Console.ForegroundColor= ConsoleColor.White;
break;
case1:
// Fondo verde.
Console.BackgroundColor= ConsoleColor.Green;
// Letras negras.
Console.ForegroundColor= ConsoleColor.Black;
break;
case2:
OpcionC1();
break;
case3:
// Fondo negro.
Console.BackgroundColor= ConsoleColor.Black;
// Letras rojo.
Console.ForegroundColor= ConsoleColor.Red;
break;
case4:
// Fondo negro.
Console.BackgroundColor= ConsoleColor.Black;
// Letras rojo.
Console.ForegroundColor= ConsoleColor.Yellow;
break;
case5:
// Fondo negro.
Console.BackgroundColor= ConsoleColor.Red;
// Letras rojo.
Console.ForegroundColor= ConsoleColor.DarkRed;
break;
case6:
MenuOpciones();
break;
default:
Console.Write("Fuera de rango. ");
break;
}
}
if(teclaOpcionC == ConsoleKey.DownArrow)
{
opcionC++;
}
if(teclaOpcionC == ConsoleKey.UpArrow)
{
opcionC--;
}
// Si está en la última opción, salta a la primera.
if(opcionC >6)
{
opcionC =0;
}
// Si está en la primera posición, salta a la última.
if(opcionC <0)
{
opcionC =6;
}
}
}
#endregion
#region OpcionC-1.
publicstaticvoid OpcionC1()
{
// Contador de teclas y navegador.
int opcionC1 =0;
// Capturar tecla para luego validar.
ConsoleKey teclaOpcionC1;
Console.Clear();
while(true)
{
Console.Clear();
switch(opcionC1)
{
case0:
Console.SetCursorPosition(0, 0);
Console.WriteLine("Estás en Opción C-1.");
Console.SetCursorPosition(0, 2);
Console.WriteLine(" SI");
Console.SetCursorPosition(16, 2);
Console.WriteLine("> NO");
break;
case1:
Console.SetCursorPosition(0, 0);
Console.WriteLine("Estás en Opción C-1.");
Console.SetCursorPosition(0, 2);
Console.WriteLine("> SI");
Console.SetCursorPosition(16, 2);
Console.WriteLine(" NO");
break;
default:
Console.Write("Fuera de rango. ");
break;
}
// Leer tecla ingresada por el usuario.
teclaOpcionC1 = Console.ReadKey(true).Key;
// Validar el tipo de tecla.
if(teclaOpcionC1 == ConsoleKey.Enter)
{
switch(opcionC1)
{
case0:
MenuPrincipal();
Console.Clear();
break;
case1:
OpcionSI();
break;
default:
Console.Write("Fuera de rango. ");
break;
}
}
// Flecha derecha.
if(teclaOpcionC1 == ConsoleKey.RightArrow)
{
opcionC1++;
}
// Flecha izquierda.
if(teclaOpcionC1 == ConsoleKey.LeftArrow)
{
opcionC1--;
}
// Si está en la última opción, salta a la primera.
if(opcionC1 >1)
{
opcionC1 =0;
}
// Si está en la primera posición, salta a la última.
if(opcionC1 <0)
{
opcionC1 =1;
}
}
}
#endregion
#region opcionSI del sub menú C-1.
publicstaticvoid OpcionSI()
{
ConsoleKey teclaOpcionB1;
Console.Clear();
do
{
Console.SetCursorPosition(0, 0);
Console.WriteLine("Estás en Opción SÍ.");
Console.SetCursorPosition(0, 2);
Console.WriteLine("Pulse Enter para ");
Console.SetCursorPosition(0, 3);
Console.WriteLine("volver atrás. ");
// Almacena el teclado pulsado en la variable teclaOpciónB1.
teclaOpcionB1 = Console.ReadKey(true).Key;
}while(teclaOpcionB1 != ConsoleKey.Enter);
}
#endregion
}
}
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).
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.
// 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
// Activar / desactivar Acceso de aplicaciones poco seguras en Google.
// https://myaccount.google.com/lesssecureapps
usingSystem;
usingSystem.Collections.Generic;
usingOpenPop.Pop3;
usingOpenPop.Mime;
usingSystem.Text.RegularExpressions;
usingSystem.IO.Ports;
usingSystem.Text;
usingSystem.Timers;
namespace Recibir_email_enviar_arduino_01
{
class Program
{
// Disparador de eventos del timer. Dispara cada cierto tiempo por el timer.
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.