Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: kakshi en 4 Agosto 2019, 08:48 am



Título: salir de un bucle presionando la tecla ESC
Publicado por: kakshi en 4 Agosto 2019, 08:48 am
ayuda necesito salir de un bucle presionando la tecla ESC

aqui dejo mi código , no logro salir del bucle .

#include<iostream>
#include<windows.h>
#include<stdlib.h>
#define ESC 27


using namespace std;
void cargando();
int tecla;

int main()
{

while(tecla!=ESC)

{

cout<<"\nCARGANDO "; cargando();


}

    system("pause");
    return 0;
}

void cargando()
{


        for(int i=0;i<10;i++)
        {
        cout<<"*";
        Sleep(100);
        if(i==9)system("cls");

        }


}


Título: Re: salir de un bucle presionando la tecla ESC
Publicado por: @XSStringManolo en 4 Agosto 2019, 11:16 am
Puedes usar la funcion kbhit() o _kbhit() para revisar el buffer en busca de la tecla. También tienes getasynckeystate()
Para algo sencillo te sirve, pero si en el futuro quieres un keylogger en C++ o algo así multiplataforma te va a ir horrible.

Hay burradas de maneras distintas de hacerlo. Las que mejor funcionan pasan por usar bibliotecas bastante grandes dependiendo de para que vayas a usar el software unas o otras. Por ejemplo los eventos de SDL2 son una marabilla pero tienes que tener la ventana al frente, por lo que para keyloggers chungo. En Qt también hay eventos de teclas, ni idea de si sirve para keylogger. Hay chorrocientas bibliotecas con sus implementaciones. También hay keyloggers codigo abierto en github para que veas que librerías suelen usar y para que plataformas.

Para windows tienes windows.h y hay varias formas de hacerlo.

Si te da todo igual y quieres algo que te funcione y ya, la manera más cutre y sencilla de hacerlo que de me ocurre:
Código
  1. #include <windows.h>
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7. bool mantenerseEnBucle = true;
  8.  
  9.   while(mantenerseEnBucle)
  10.   {
  11.  
  12.    if(GetAsyncKeyState(VK_ESCAPE))
  13.      {
  14.       mantenerseEnBucle = false;
  15.       cin.ignore();
  16.       }
  17.    }
  18.  
  19. return 0;
  20. }
Puedes meterle un sleep entre cada iteración del bucle para reducir la carga en el procesador pero igual no te registra la tecla si coincide con el sleep. Por eso se suele usar _kbhit() y comprobar el buffer, pero también tiene sus problemas de no registrar teclas. Mi primer keylogger lo hice con _kbhit() y era una patata, no pillaba ni el 60% de las pulsaciones por mucho que lo ajustaba.
Entre otras formas puedes consultar la documentación oficial de microsoft con winapi para buscar una manera funcional y práctica de hacerlo. O lo que te comenté de revisar keyloggers código abierto y probar alguno que te funcione guay para mirar la documentación de las funciones y librerías que usan. Los código de botnets y rotkits suelen tener también módulos de keyloggers totalmente funcionales.

El std no recoge forma std de hacerlo.  

Tu código no hace nada porque no tienes nada que revise el buffer, o capture teclas, solo el virtual code de la tecla, pero no lo comparas con nada.

Pd: stdlib.h te sobra, no la estás usando. Y si en otros códigos no vas a usar window.h para nada extra que no sea system, tienes la alternativa de cin.get(); que viene incluida en iostream.

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4. int main()
  5. {
  6. cout << "Ejemplo" << endl << "xD" << endl;
  7. cin.get();
  8. return 0;
  9. }


Título: Re: salir de un bucle presionando la tecla ESC
Publicado por: kakshi en 4 Agosto 2019, 21:49 pm
Gracias string Manolo ,si funciono la función  kbhit()