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


 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Mejorar el código en C++ nativo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Mejorar el código en C++ nativo  (Leído 453 veces)
Meta


Desconectado Desconectado

Mensajes: 3.203



Ver Perfil WWW
Mejorar el código en C++ nativo
« en: 7 Julio 2020, 15:05 »

Buenas:

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
  1. #include <iostream>
  2. #include <windows.h> // Para mostrar texto en el título de la ventana.
  3.  
  4. using namespace std;
  5. //using std::cout;
  6. //using std::cin;
  7.  
  8. // Función posición del cursor.
  9. void gotoxy(int x, int y)
  10. {
  11. HANDLE hcon;
  12. hcon = GetStdHandle(STD_OUTPUT_HANDLE);
  13. COORD dwPos;
  14. dwPos.X = x;
  15. dwPos.Y = y;
  16. SetConsoleCursorPosition(hcon, dwPos);
  17. }
  18.  
  19. int main(void)
  20. {
  21. // Mostrar caracteres correctamente en pantalla y título de la ventana.
  22. SetConsoleOutputCP(65001);
  23. wchar_t titulo[128];
  24. MultiByteToWideChar(CP_UTF8, 0, "Consola C++ nativo 2019.", -1, titulo, 128);
  25. SetConsoleTitle(titulo);
  26.  
  27. // Variable.
  28. char entrada[] = "\0"; // Guarda A, a, C, y c tipo string que introduces desde la consola.
  29.  
  30. // Tamaño de la pantalla. Se cambia en los dos últimos dígitos.
  31. SMALL_RECT r = { 0, 0, 29, 8 }; // X = 29, Y = 8.
  32. SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &r);
  33.  
  34. // Ocultar cursor.
  35. CONSOLE_CURSOR_INFO cci;
  36. GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
  37. cci.bVisible = 0; // 0 oculta. 1 muestra cursor.
  38. SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
  39.  
  40. // Muestra textos en pantalla.
  41. cout << "Control bandeja del lector: " << endl << endl;
  42. cout << "A - Abrir bandeja." << endl;
  43. cout << "C - Cerrar bandeja." << endl;
  44. cout << "===========================" << endl;
  45.  
  46. while (true)
  47. {
  48.  
  49.  
  50. // Aquí introduces letras A, a, C y c.
  51. cin >> entrada;
  52. cout << "\n" << endl;
  53.  
  54. // Abrir bandeja.
  55. if ((entrada[0] == 'a') || (entrada[0] == 'A'))
  56. {
  57. // Posición del cursor.
  58. gotoxy(0, 6);
  59. cout << "Abriendo..." << endl << endl; // Muestra texto en pantalla.
  60. mciSendString(L"set cdaudio door open", nullptr, 0, nullptr);
  61. gotoxy(0, 6);
  62. cout << "Abierto.   " << endl << endl; // Muestra texto en pantalla.
  63. }
  64.  
  65. // Cerrar bandeja.
  66. else if ((entrada[0] == 'c') || (entrada[0] == 'C'))
  67. {
  68. gotoxy(0, 6);
  69. cout << "Cerrando..." << endl << endl; // Muestra texto en pantalla.
  70. mciSendString(L"set cdaudio door closed", nullptr, 0, nullptr);
  71. gotoxy(0, 6);
  72. cout << "Cerrado.   " << endl << endl; // Muestra texto en pantalla.
  73. }
  74.  
  75. // Si haz pulsado otro caracter distinto de A, C, a y c aparece
  76. else
  77. {
  78. gotoxy(0, 6);
  79. // este mensaje.
  80. cout << "Solo pulsa A o C." << endl << endl;
  81. }
  82.  
  83. }
  84. return EXIT_SUCCESS;
  85. }

En el código de C# si funciona tal como lo quiero, pongo un ejemplo abajo.

Código C#:
Código
  1. using System;
  2. using System.Runtime.InteropServices;
  3. using System.Text;
  4. namespace Bandeja_consola_cs
  5. {
  6.    class Program
  7.    {
  8.        [DllImport("winmm.dll")]
  9.        public static extern Int32 mciSendString(string lpstrCommand, StringBuilder lpstrReturnString,
  10.        int uReturnLength, IntPtr hwndCallback);
  11.        public static StringBuilder rt = new StringBuilder(127);
  12.        public static void DoEventsAbriendo()
  13.        {
  14.            Console.SetCursorPosition(0, 6);
  15.            Console.Write("Abriendo...");
  16.        }
  17.        public static void DoEventsCerrando()
  18.        {
  19.            Console.SetCursorPosition(0, 6);
  20.            Console.Write("Cerrando...");
  21.        }
  22.        static void Main(string[] args)
  23.        {
  24.            // Título de la ventana.
  25.            Console.Title = "Consola C# 2017";
  26.            // Tamaño ventana consola.
  27.            Console.WindowWidth = 29; // X. Ancho.
  28.            Console.WindowHeight = 8; // Y. Alto.
  29.            // Cursor invisible.
  30.            Console.CursorVisible = false;
  31.            // Posición del mansaje en la ventana.
  32.            Console.SetCursorPosition(0, 0);
  33.            Console.Write(@"Control bandeja del lector:
  34. A - Abrir bandeja.
  35. C - Cerrar bandeja.
  36. ===========================");
  37.            ConsoleKey key;
  38.            //Console.CursorVisible = false;
  39.            do
  40.            {
  41.                key = Console.ReadKey(true).Key;
  42.                string mensaje = string.Empty;
  43.                //Asignamos la tecla presionada por el usuario
  44.                switch (key)
  45.                {
  46.                    case ConsoleKey.A:
  47.                        // mensaje = "Abriendo...";
  48.                        Console.SetCursorPosition(0, 6);
  49.                        DoEventsAbriendo();
  50.                        mciSendString("set CDAudio door open", rt, 127, IntPtr.Zero);
  51.                        mensaje = "Abierto.   ";
  52.                        break;
  53.                    case ConsoleKey.C:
  54.                        // mensaje = "Cerrando...";
  55.                        Console.SetCursorPosition(0, 6);
  56.                        DoEventsCerrando();
  57.                        mciSendString("set CDAudio door closed", rt, 127, IntPtr.Zero);
  58.                        mensaje = "Cerrado.   ";
  59.                        break;
  60.                }
  61.                Console.SetCursorPosition(0, 6);
  62.                Console.Write(" ");
  63.                Console.SetCursorPosition(0, 6);
  64.                Console.Write(mensaje);
  65.            }
  66.            while (key != ConsoleKey.Escape);
  67.        }
  68.    }
  69. }

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.


En línea

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/
ThunderCls


Desconectado Desconectado

Mensajes: 432


Coder | Reverser | Gamer


Ver Perfil WWW
Re: Mejorar el código en C++ nativo
« Respuesta #1 en: 7 Julio 2020, 17:13 »

No creo que exista una manera estandar en C++ para lograr lo que deseas, sin embargo puedes usar un par de opciones:

1- Usando la funcion "getch()" de la libreria NO estandar "conio.h" (getch() espera una entrada del teclado pero no la muestra en la consola)

2- Usando la API de Windows para modificar el comportamiento de la consola:
Código
  1. SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), GetStdHandle(STD_OUTPUT_HANDLE) & ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT));
   
    Para leer y escribir:
        
Código
  1. ReadConsole(...)/WriteConsole(...)

3- Usando GetAsyncKeyState(...) en un loop

4- Usando un hook de teclado con GetConsoleWindow(...)/SetWindowsHookEx(...)

Saludos


« Última modificación: 7 Julio 2020, 17:23 por ThunderCls » En línea

-[ "…I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/
Meta


Desconectado Desconectado

Mensajes: 3.203



Ver Perfil WWW
Re: Mejorar el código en C++ nativo
« Respuesta #2 en: 8 Julio 2020, 02:40 »

Buenas:

Por lo que entiendo. cambiar esto:
Código
  1. cin >> entrada;
Por esto otro:
Código
  1. entrada = getch();

En la línea 58 aparecen estos dos errores.

Gravedad   Código   Descripción   Proyecto   Archivo   Línea   Origen   Estado suprimido
Error (activo)   E0137   la expresión debe ser un valor L modificable   Bandeja_consola_nativo_cpp   C:\Users\Meta\Documents\Visual Studio 2019\Projects\Bandeja_consola_nativo_cpp\Bandeja_consola_nativo_cpp\Bandeja_consola_nativo_cpp.cpp   58   IntelliSense   


Gravedad   Código   Descripción   Proyecto   Archivo   Línea   Origen   Estado suprimido
Error   C3863   el tipo de matriz 'char [2]' no es asignable   Bandeja_consola_nativo_cpp   C:\Users\Meta\Documents\Visual Studio 2019\Projects\Bandeja_consola_nativo_cpp\Bandeja_consola_nativo_cpp\Bandeja_consola_nativo_cpp.cpp   58   Compilación   
En línea

Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/
ThunderCls


Desconectado Desconectado

Mensajes: 432


Coder | Reverser | Gamer


Ver Perfil WWW
Re: Mejorar el código en C++ nativo
« Respuesta #3 en: 8 Julio 2020, 04:42 »

No lo tomes a mal, pero en mi opinion creo que necesitas esforzarte un poco mas en buscar respuestas por ti mismo a problemas sencillos con los que te encuentras, intentar entenderlos te ayudara a avanzar y obtener experiencia, no puedes pretender que todo te lo den hecho o que cada vez que tengas un minimo error recurrir al foro. En fin, como dije al principio, no lo tomes a mal, pero necesitas aprender a usar Google e intentar entender por ti mismo lo que te sucede.

Habiendo dicho lo anterior, si buscas el prototipo de la funcion getch() te daras cuenta de como usarla correctamente:

Código
  1. // por cierto getch esta obsoleto, debes usar _getch en su lugar
  2. int _getch(void);

La funcion no toma parametros y devuelve un int que equivale al valor de la tecla presionada. En tu codigo intentas usar la variable "entrada" que esta definida como un arreglo de chars, por lo que evidentemente tendras ese error. Visual Studio te advierte de esta operacion "el tipo de matriz 'char [2]' no es asignable". El modo correcto de uso seria:

Código
  1. int key = _getch();
  2. // o usando la conversion implicita a char
  3. char key = _getch();

Saludos

En línea

-[ "…I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Crear código nativo con Mono « 1 2 »
.NET (C#, VB.NET, ASP)
Casidiablo 11 5,427 Último mensaje 1 Agosto 2006, 17:07
por Casidiablo
P-Code o Codigo Nativo? Que me recomiendan? « 1 2 »
Ingeniería Inversa
katanaia 19 12,256 Último mensaje 14 Abril 2009, 07:18
por gardelitolucho
Como se lee el codigo nativo(native code)
Ingeniería Inversa
hunter18 1 2,153 Último mensaje 20 Junio 2010, 13:22
por karmany
Mejorar el codigo
Programación C/C++
AprendiendoAProgramar 5 1,784 Último mensaje 21 Diciembre 2017, 05:13
por engel lex
Prueba leer la dll nativo con interfaz C++ nativo
Programación C/C++
Meta 9 722 Último mensaje 7 Julio 2020, 15:02
por Meta
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines