Autor
|
Tema: Desde que pulse una tecla, que ejecuta dicha acción (Leído 6,258 veces)
|
Meta
|
Buenas gente: Aquí tengo un programa que solo se ejecuta una orden si pulso el 1 y luego Enter. ¿Hay alguna manera que pulse la tecla 1 y me ejecute una acción sin luego pulsar Enter? El código que es este. #include <iostream> #include <fstream> #include <Windows.h> // Para mostrar texto en el título de la ventana. #include <stdio.h> // Cambio color de fondo y letras. #include "SerialClass.h" using namespace std; //using std::cout; //using std::cin; // Función posición del cursor. void gotoxy(int x, int y) { HANDLE hcon; hcon = GetStdHandle(STD_OUTPUT_HANDLE); COORD dwPos; dwPos.X = x; dwPos.Y = y; SetConsoleCursorPosition(hcon, dwPos); } int main() { #pragma region "Configuración ventana." // Mostrar caracteres correctamente en pantalla y título de la ventana. SetConsoleOutputCP(65001); wchar_t titulo[128]; MultiByteToWideChar(CP_UTF8, 0, "Led Arduino C++ nativo", -1, titulo, 128); SetConsoleTitleW(titulo); // Tamaño de la pantalla. Se cambia en los dos últimos dígitos. SMALL_RECT r = { 0, 0, 80, 20 }; // X = 49, Y = 9. SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &r); // Cambio color de 6 (naranja claro), color letras 0 (negro). system("color 60"); // Ocultar cursor. CONSOLE_CURSOR_INFO cci; GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci); cci.bVisible = 0; // 0 oculta. 1 muestra cursor. SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci); #pragma endregion // Puerto serie. Serial* Puerto = new Serial("COM4"); // Comandos para Arduino. char Luz_ON[] = "Luz_ON"; // Envía "Luz_ON" al puerto serie. char Luz_OFF[] = "Luz_OFF"; char lectura[50] = "\0"; // Guardan datos de entrada del puerto. int opc; // Guarda un 1 o 2 tipo entero queintroduces desde la consola. while (Puerto->IsConnected()) { cout << endl; // Retorno. cout << "Introduzca la opcion deseada: " << endl; cout << "Pulse 1 para encender el Led, pulse 2 para apagar." << endl << endl; // Muestra texto en pantalla. cin >> opc; // Aquí introduces un número, el 1 o el 2. switch (opc) // Espera recibir un 1 o un 2. { case 1: // Encener luz. cout << "Enviando: " << Luz_ON << endl; // Muestra en pantalla textos. Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON". break; case 2: // Apagar luz. cout << "Enviando: " << Luz_OFF << endl; Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1); break; default: // Si haz pulsado otro número distinto del 1 y 2, muestra cout << "Puse del 1 al 2."; // este mensaje. } Sleep(500); int n = Puerto->ReadData(lectura, 49); // Recibe datos del puerto serie. if (n > 0) { lectura[n + 1] = '\0'; // Limpia de basura la variable. cout << "Recibido: " << lectura << endl; // Muestra en pantalla dato recibido. cout << "-------------------" << endl; } cin.ignore(256, '\n'); // Limpiar buffer del teclado. } }
Saludos.
|
|
|
En línea
|
|
|
|
RayR
Desconectado
Mensajes: 243
|
La forma más sencilla es usar _getch, declarada en conio.h. La aclaración pertinente (porque hay mucha información equivocada u obsoleta al respecto): aunque es sólo para Windows (lo cual claramente no es un problema en tu caso), actualmente es parte oficial de sus APIs, así que debería funcionarte con cualquier compilador para este SO sin necesidad de instalar nada extra. También podrías implementar esta funcionalidad mediante SetConsoleMode, pero no le veo mucho caso, cuando _getch ya hace todo el trabajo sucio (internamente llama a SetConsoleMode y ReadConsoleInput).
|
|
|
En línea
|
|
|
|
Meta
|
Suena jaleo, deja ver como implemento el https://learn.microsoft.com/es-es/cpp/c-runtime-library/reference/getch-getwch?view=msvc-170Saludos y gracias.
La forma más sencilla es usar _getch, declarada en conio.h. La aclaración pertinente (porque hay mucha información equivocada u obsoleta al respecto): aunque es sólo para Windows (lo cual claramente no es un problema en tu caso), actualmente es parte oficial de sus APIs, así que debería funcionarte con cualquier compilador para este SO sin necesidad de instalar nada extra. También podrías implementar esta funcionalidad mediante SetConsoleMode, pero no le veo mucho caso, cuando _getch ya hace todo el trabajo sucio (internamente llama a SetConsoleMode y ReadConsoleInput). ¿Te refieres algo así? #include <iostream> #include <conio.h> using namespace std; int main() { cout<<"Presione una tecla: \n"; int tecla = _getch(); cout << "La tecla pulsada es: "<<char(tecla)<< endl; return 0; }
Por ahora he hecho este código de abajo, sin embargo, todavía hay que pulsar una tecla y luego Enter, la idea es pulsar una tecla, sea con números o letras, automáticamente me ejecute una acción, en este ejemplo, enviar un mensaje al puerto serie. #include <iostream> #include <fstream> #include <conio.h> // Controla el _getch. #include <Windows.h> // Para mostrar texto en el título de la ventana. #include <stdio.h> // Cambio color de fondo y letras. #include "SerialClass.h" using namespace std; //using std::cout; //using std::cin; // Función posición del cursor. void gotoxy(int ancho_x, int alto_y) { HANDLE hcon; hcon = GetStdHandle(STD_OUTPUT_HANDLE); COORD dwPos{}; dwPos.X = ancho_x; dwPos.Y = alto_y; SetConsoleCursorPosition(hcon, dwPos); } int main() { #pragma region "Configuración ventana." // Mostrar caracteres correctamente en pantalla y título de la ventana. SetConsoleOutputCP(65001); wchar_t titulo[128]; MultiByteToWideChar(CP_UTF8, 0, "Led Arduino C++ nativo", -1, titulo, 128); SetConsoleTitleW(titulo); // Tamaño de la pantalla. Se cambia en los dos últimos dígitos. SMALL_RECT r = { 0, 0, 80, 20 }; // X = 49, Y = 9. SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &r); // Cambio color de 6 (naranja claro), color letras 0 (negro). system("color 60"); // Ocultar cursor. CONSOLE_CURSOR_INFO cci; GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci); cci.bVisible = 0; // 0 oculta. 1 muestra cursor. SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci); #pragma endregion // Puerto serie. Serial* Puerto = new Serial("COM4"); // Comandos para Arduino. char Luz_ON[] = "Luz_ON"; // Envía "Luz_ON" al puerto serie. char Luz_OFF[] = "Luz_OFF"; char lectura[50] = "\0"; // Guardan datos de entrada del puerto. char tecla = _getch(); // Guarda un 1, 2 o un 3 tipo entero queintroduces desde la consola. while (Puerto->IsConnected()) { cout << endl; // Retorno. cout << "Introduzca la opcion deseada: " << endl; cout << "Pulse 1 para encender el Led, 2 para apagar, 3 para limpiar pantalla." << endl << endl; // Muestra texto en pantalla. cin >> tecla; // Aquí introduces un número, el 1 o el 2. switch (tecla) // Espera recibir un 1 o un 2. { case '1': // Encener luz. cout << "Enviando: " << Luz_ON << endl; // Muestra en pantalla textos. Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON". break; case '2': // Apagar luz. cout << "Enviando: " << Luz_OFF << endl; Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1); break; case '3': // Limpiar pantalla. cout << "Limpiando pantalla..." << endl; system("cls"); // Limpiar pantalla. break; default: // Si haz pulsado otro número distinto del 1 y 2, muestra cout << "Puse del 1 al 3."; // este mensaje. } Sleep(500); int n = Puerto->ReadData(lectura, 49); // Recibe datos del puerto serie. if (n > 0) { lectura[n + 1] = '\0'; // Limpia de basura la variable. cout << "Recibido: " << lectura << endl; // Muestra en pantalla dato recibido. cout << "-------------------" << endl; } cin.ignore(256, '\n'); // Limpiar buffer del teclado. } return 0; }
Saludos.
|
|
« Última modificación: 4 Febrero 2023, 12:44 pm por Eternal Idol »
|
En línea
|
|
|
|
4v1dy4
Desconectado
Mensajes: 139
|
Hola, Como dijo RayR, puedes utilizar _getch o getche. Antes de querer implementar algo de otra forma, tienes que saber para que sirve ese algo en primer lugar. Tienes que presionar [ENTER] cuando llamas a la funcion getchar() (o el equivalente en C++, cin) para determinar CUANDO acaba la cadena de caracteres, porque se supone de antemano que la cadena, por logica, empieza en cuanto presionas una tecla. puntos clave: La cadena empieza cuando presionas una tecla. La cadena termina cuando presionas [ENTER]. La funcion _getch, lo que hace es leer el estado del teclado actual. Es decir, no ESPERA, sino que LEE, el estado actual. Es como si le hiciera un snapshot a todas las teclas. En fin, el punto es que _getch es inutil si no determinas CUANDO has presionado una tecla. Porque de nada sirve que ejecutes el programa e inmediatamente llames a _getch, porque probablemente no estaras presionando nada (O si. El problema es que no lo sabes). Entonces, ¿Como llamar a _getch? Haciendo uso de la funcion kbhit() kbhit retorna 1 cuando alguna tecla del teclado esta siendo presionada actualmente, y retorna 0 cuando ninguna tecla del teclado esta siendo presionada actualmente. Es decir, para esperar a que una tecla sea presionada, haces: while(!kbhit());
El ciclo va a terminar inmediatamente cuando se presione una tecla. Es entonces cuando llamas a _getch para que rapidamente tome un snapshot del teclado, y retorne la tecla que esta siendo presionada actualmente: while(!kbhit()); key=_getch();
Puedes probar el funcionamiento con este codigo: #include <stdio.h> #include <conio.h> int main() { int key; while(!kbhit()); key=_getch(); key); return 0; }
IMPORTANTE: Te recomiendo que juegues con ese ultimo codigo. Quita el while(...); para que veas lo que sucede. PD: Vi que esto lo estas implementando el Windows. Para que sepas, no se si te importa la portabilidad pero en Linux, ademas de que no se si funcione, seria mejor implementarlo con la libreria ncurses. Un saludo.
|
|
|
En línea
|
|
|
|
RayR
Desconectado
Mensajes: 243
|
No había visto que escribiste algo más. El problema es que pones el _getch fuera del while. Lo que debes hacer es cambiar esto: cin >> tecla;
por: tecla = _getch();
La funcion _getch, lo que hace es leer el estado del teclado actual. Es decir, no ESPERA, sino que LEE, el estado actual.
No, no es así. La que hace eso es GetKeyboardState. _getch espera hasta que haya algo en su buffer (que es distinto del de stdin), y luego lo lee y devuelve el valor.
|
|
|
En línea
|
|
|
|
4v1dy4
Desconectado
Mensajes: 139
|
La que hace eso es GetKeyboardState Claro que no. ¿Por que mientes?Es broma. Tienes razon XD No se por que me confundi si los nombres no se parecen en nada. Creo que estoy desarrollando Alzheimer xddd se vienen posts mios a lo win_7. En fin. Gracias por la correccion.
|
|
|
En línea
|
|
|
|
Meta
|
Ya me funciona. // system("cls"); // Limpiar pantalla. #include <iostream> #include <fstream> #include <conio.h> // Controla el _getch. #include <Windows.h> // Para mostrar texto en el título de la ventana. #include <stdio.h> // Cambio color de fondo y letras. #include "SerialClass.h" using namespace std; //using std::cout; //using std::cin; // Función posición del cursor. void gotoxy(int ancho_x, int alto_y) { HANDLE hcon; hcon = GetStdHandle(STD_OUTPUT_HANDLE); COORD dwPos{}; dwPos.X = ancho_x; dwPos.Y = alto_y; SetConsoleCursorPosition(hcon, dwPos); } int main() { #pragma region "Configuración ventana." // Mostrar caracteres correctamente en pantalla y título de la ventana. SetConsoleOutputCP(65001); wchar_t titulo[128]; MultiByteToWideChar(CP_UTF8, 0, "Led Arduino C++ nativo", -1, titulo, 128); SetConsoleTitleW(titulo); // Tamaño de la pantalla. Se cambia en los dos últimos dígitos. SMALL_RECT r = { 0, 0, 80, 20 }; // X = 49, Y = 9. SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &r); // Cambio color de 6 (naranja claro), color letras 0 (negro). system("color 60"); // Ocultar cursor. CONSOLE_CURSOR_INFO cci; GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci); cci.bVisible = 0; // 0 oculta. 1 muestra cursor. SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci); #pragma endregion // Comandos para Arduino. char Luz_ON[] = "Luz_ON"; // Envía "Luz_ON" al puerto serie. char Luz_OFF[] = "Luz_OFF"; char limpiar7[] = " "; // Siete espacios en blanco para limpiar un área seleccionado. char lectura[50] = "\0"; // Guardan datos de entrada del puerto. char tecla; // Guarda un 1, 2 o un 3 tipo entero queintroduces desde la consola. // Puerto serie. Serial* Puerto = new Serial("COM5"); gotoxy(0, 0); // Posición de la pantalla. cout << endl; // Retorno. cout << "Introduzca la opcion deseada: " << endl; cout << "Pulse 1 para encender el Led, 2 para apagar, 3 para limpiar pantalla." << endl << endl; while (Puerto->IsConnected()) { tecla = _getch(); // Aquí introduces un número, el 1 o el 2. switch (tecla) // Espera recibir un 1 o un 2. { case '1': // Encener luz. gotoxy(10, 5); cout << limpiar7; gotoxy(0, 5); cout << "Enviando: " << Luz_ON << endl; // Muestra en pantalla textos. Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1); // Envía al puerto el texto "Luz_ON". gotoxy(0, 9); cout << " "; // Borrado del mensaje si haz pulsado distinto del 1 o la tecla 2. break; case '2': // Apagar luz. gotoxy(10, 5); cout << limpiar7; gotoxy(0, 5); cout << "Enviando: " << Luz_OFF << endl; Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1); gotoxy(0, 9); cout << " "; break; default: // Si haz pulsado otro número distinto del 1 y 2, muestra gotoxy(0, 9); cout << "Pulse las teclas el 1 o el 2."; // este mensaje. } Sleep(500); int numeros = Puerto->ReadData(lectura, 49); // Recibe datos del puerto serie. if (numeros > 0) { lectura[numeros + 1] = '\0'; // Limpia de basura la variable. gotoxy(0, 7); cout << "Recibido: " << lectura << endl; // Muestra en pantalla dato recibido. cout << "-----------------------------" << endl; } } return 0; }
Gracias a todos mi muy distinguidos amigos.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Como se ejecuta virus desde usb
Análisis y Diseño de Malware
|
franfis
|
3
|
4,141
|
8 Julio 2012, 04:23 am
por nts94
|
|
|
Generar números aleatorios cuando se ejecuta una acción.
.NET (C#, VB.NET, ASP)
|
soapmactavish
|
0
|
1,472
|
4 Abril 2013, 09:45 am
por soapmactavish
|
|
|
Como hacer que C# pulse una tecla por ti?
.NET (C#, VB.NET, ASP)
|
andrecid
|
2
|
4,915
|
29 Julio 2015, 17:31 pm
por Eleкtro
|
|
|
emular click cuando pulse la tecla 1
Programación C/C++
|
persona3
|
1
|
2,172
|
30 Agosto 2017, 11:54 am
por ivancea96
|
|
|
Programa que pulse "X" tecla en "Y" ventanas/procesos
Programación General
|
bySprigans
|
2
|
4,163
|
2 Octubre 2017, 10:53 am
por bySprigans
|
|