Tengo este código en C++ nativo, en el cual aún no logro que funcione tal como lo quiero. Lo que hace este código es, que si pulsas la letra A o a, se abre la bandeja del lector del disco, si pulsas C o c se cierra.
Código C++ nativo:
Código
#include <iostream> #include <windows.h> // Para mostrar texto en el título de la ventana. 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(void) { // Mostrar caracteres correctamente en pantalla y título de la ventana. SetConsoleOutputCP(65001); wchar_t titulo[128]; MultiByteToWideChar(CP_UTF8, 0, "Consola C++ nativo 2019.", -1, titulo, 128); SetConsoleTitle(titulo); // Variable. char entrada[] = "\0"; // Guarda A, a, C, y c tipo string que introduces desde la consola. // Tamaño de la pantalla. Se cambia en los dos últimos dígitos. SMALL_RECT r = { 0, 0, 29, 8 }; // X = 29, Y = 8. SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &r); // 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); // Muestra textos en pantalla. cout << "Control bandeja del lector: " << endl << endl; cout << "A - Abrir bandeja." << endl; cout << "C - Cerrar bandeja." << endl; cout << "===========================" << endl; while (true) { // Aquí introduces letras A, a, C y c. cin >> entrada; cout << "\n" << endl; // Abrir bandeja. if ((entrada[0] == 'a') || (entrada[0] == 'A')) { // Posición del cursor. gotoxy(0, 6); cout << "Abriendo..." << endl << endl; // Muestra texto en pantalla. mciSendString(L"set cdaudio door open", nullptr, 0, nullptr); gotoxy(0, 6); cout << "Abierto. " << endl << endl; // Muestra texto en pantalla. } // Cerrar bandeja. else if ((entrada[0] == 'c') || (entrada[0] == 'C')) { gotoxy(0, 6); cout << "Cerrando..." << endl << endl; // Muestra texto en pantalla. mciSendString(L"set cdaudio door closed", nullptr, 0, nullptr); gotoxy(0, 6); cout << "Cerrado. " << endl << endl; // Muestra texto en pantalla. } // Si haz pulsado otro caracter distinto de A, C, a y c aparece else { gotoxy(0, 6); // este mensaje. cout << "Solo pulsa A o C." << endl << endl; } } return EXIT_SUCCESS; }
En el código de C# si funciona tal como lo quiero, pongo un ejemplo abajo.
Código C#:
Código
using System; using System.Runtime.InteropServices; using System.Text; namespace Bandeja_consola_cs { class Program { [DllImport("winmm.dll")] public static extern Int32 mciSendString(string lpstrCommand, StringBuilder lpstrReturnString, int uReturnLength, IntPtr hwndCallback); public static StringBuilder rt = new StringBuilder(127); public static void DoEventsAbriendo() { Console.SetCursorPosition(0, 6); Console.Write("Abriendo..."); } public static void DoEventsCerrando() { Console.SetCursorPosition(0, 6); Console.Write("Cerrando..."); } static void Main(string[] args) { // Título de la ventana. Console.Title = "Consola C# 2017"; // Tamaño ventana consola. Console.WindowWidth = 29; // X. Ancho. Console.WindowHeight = 8; // Y. Alto. // Cursor invisible. Console.CursorVisible = false; // Posición del mansaje en la ventana. Console.SetCursorPosition(0, 0); Console.Write(@"Control bandeja del lector: A - Abrir bandeja. C - Cerrar bandeja. ==========================="); ConsoleKey key; //Console.CursorVisible = false; do { key = Console.ReadKey(true).Key; string mensaje = string.Empty; //Asignamos la tecla presionada por el usuario switch (key) { case ConsoleKey.A: // mensaje = "Abriendo..."; Console.SetCursorPosition(0, 6); DoEventsAbriendo(); mciSendString("set CDAudio door open", rt, 127, IntPtr.Zero); mensaje = "Abierto. "; break; case ConsoleKey.C: // mensaje = "Cerrando..."; Console.SetCursorPosition(0, 6); DoEventsCerrando(); mciSendString("set CDAudio door closed", rt, 127, IntPtr.Zero); mensaje = "Cerrado. "; break; } Console.SetCursorPosition(0, 6); Console.Write(" "); Console.SetCursorPosition(0, 6); Console.Write(mensaje); } while (key != ConsoleKey.Escape); } } }
Lo que hace el código C# exactamente todos estos comportamientos.
1. Te pregunta si pulsas teclas, por ejemplo la A para abrir la bandeja y C para cerrar, independientemente si es mayúscula o no. Funciona todo.
2. Desde que pulse cualquier letra del teclado que non corresponda la A, a, C y la c, el programa no hace nada, como debe ser.
3. Si quiero abrir la bandeja del lector y pulso la tecla A, desde que pulse la tecla, se abre la bandeja.
4. Desde que pulse la tecla A, dice el mensaje "Abriendo...", cuando esté abierto la bandeja del todo, dice "Abierto.".
Lo que hace el código C++ nativo y no quiero.
1. Pulso la tecla A o la a, y aparece escrito en la consola.
2. Luego tengo que pulsar la tecla Enter para que la letra A o la a, funcione el comando. Entonces ya puede abrir la bandeja y mostrar los mensajes Abriendo... y Aabierto.
La pregunta es. ¿Se puede corregir este comportamiento de C++ nativo que sea igual al ejemplo de C#?
Saludos.