Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Detectar pulsación de tecla sin imprimirla en pantalla (sin Libreria conio) (https://www.clubdelphi.com/foros/showthread.php?t=52116)

Daniel316 10-01-2008 21:29:50

Detectar pulsación de tecla sin imprimirla en pantalla (sin Libreria conio)
 
Hola a todos
Es mi primer post por lo tanto deseo presentarme
Soy Daniel tengo 55 años y autodidacta en Java y C++.-

...........................
char primer[10],segundo[10],apellido[10];

cout << "Ingrese primer nombre(maximo 10 caracteres).:";
cin.gets(primer);

cout << "Ingrese segundo nombre(maximo 10 caracteres):";
cin.gets(segundo);
...........................

Bueno la cuestión es con en el ingreso de datos, lo que pretendo
es que al ingresar por Ej. 10 caracteres en "Ingrese primer
nombre..:" automáticamente se pase a "Ingrese segundo nombre..:"
y así sucesivamente.-
Para ello creo que la única manera es hacer un bucle, pero quiero
hacerlo sin la biblioteca "conio" con el uso de "getch()".-
La pregunta es: alguien conoce alguna función que detecte la
tecla presionada sin imprimirla en pantalla...?
Programa en Dev-C++ - C++

Un gran abrazo
Daniel:)

grandmasterdari 12-01-2008 00:25:17

intento de solucion
 
pues amigo no es muy facil de entender lo que pides, este es mi intento

getch() //funcion que retorna el valor de la tecla presionada
gotoxy(int x, int y) // requiere incluir conio.h funcion que posiciona el cursor en el shell (25 x 80 si mal no recuerdo)

tecla presionada se devuelve en forma ascii, o sea si presionamos la A getch() devuelve 23 orx 'A' y se imprime en pantalla
pero.. señor... ud no quiere que se imprima en pantalla segun entiendo. entonces vamos a tener ke ir a borrarlo, retrocediendo una posicion y escribiendo un blanco 32 orx ' ' y retrocediento (si otra vez) una posicion.
Magia, es mas rapido que la vista, ni siquiera vimos que apretamos.
el codigo seria algo asi
Código:

            ch=getch();
            gotoxy(wherex()-1,wherey());
            printf(" ");
            gotoxy(wherex()-1,wherey());

y al final la variable ch (char) contiene lo que presionamos.
para hacerlo iterativo. por ejemplo. capturar un string de 15 caracteres

Código:

printf("ingrese el nombre (15 caracteres)");
char str[15];
for(int i=0;i<15;i++){
            str[i]=getch();
            gotoxy(wherex()-1,wherey());
            printf(" ");
            gotoxy(wherex()-1,wherey());           
}

y capturamos un string de 15 caracteres sin mover el cursor, sin que los ojos lo detecten.
Si vamos a trabajar con DOS, hay ke utilizar muuuuucho el gotoxy(int x,inty) recomiendo que se mude a una interfaz de windows ya que lleva mucho tiempo crear un programa cuya interfaz "grafica" es un shell (ventanita de DOS o terminal), y distrae al programador del verdadero problema, los requisitos del software

JuanErasmo 12-01-2008 17:45:03

Investiga en este foro sobre Hook de teclado
 
Buenos dias,

hace tiempo hice un software para keylogger, con la funcion, pulsaba la tecla, y quedaba "atrapada en el hook," y yo tenia con codigo, que mostrarla.

Si estas interesado responde este hilo, o mira las solciones en los foros, busca hook de teclado.

Tengo el codigo en C++, contactame para enviartelo,
Gracias.

Daniel316 12-01-2008 20:04:07

Hola JuanErasmo
Baya si me interesa, lo único que espero es poder entenderlo
ya que hace muy poco comencé con C++.-

Me gustaría que lo pongas aqui para beneficio de todos
de lo contrario este es mi correo:rdvsm316@wanadoo.es

Un muchas gracias JuanErasmo
Un gran abrazo a todos
Daniel:)

Daniel316 12-01-2008 20:47:03

Sin Conio ni el Api de Windows
 
Hola
Un muchas gracias grandmasterdari
Evidentemente la alegría del post de JuanErasmo me hizo
apurarme a responder.-
Lo que yo deseo es capturar la pulsación de las teclas
sin imprimirla en pantalla, sin hacer uso de Conio ni el
Api de Windows (sera posible...?), si no obtengo una
respuesta satisfactiria lo voy a hacer con PDCurses, lo
malo de esta librería es que no puedo encontrar ninguna
documentación en Español.-

Chau
Daniel:)

JuanErasmo 18-01-2008 23:04:45

asi es como se hace, disculpa la demora.
 
Código:

void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
 {
 
  if (Msg.message == WM_HOTKEY)
  {
    //  if( (LOWORD(Msg.lParam) == MOD_SHIFT ) && (HIWORD(Msg.lParam) == 88) ){
        if( (LOWORD(Msg.lParam) == MOD_SHIFT ) && (HIWORD(Msg.lParam) == VK_F2) ){
          UnregisterHotKey(Application->Handle, GlobalAddAtomA("MiHotKeyXM"));
          keybd_event(VK_F2,0,0,0);



La franja horaria es GMT +2. Ahora son las 14:01:52.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi