Discussion:
Captrar teclas pulsadas
(demasiado antiguo para responder)
AntyDesk
2003-11-17 13:32:01 UTC
Permalink
Como puedo capturar las teclas pulsadas directamente (sin utilizar
scanf ni nada de eso) ?

habia pensado lellendo en las direcciones de memoria de las teclas

alguien me puede decir como hacerlo?

gracias de antemano.
Martin J. Sanchez
2003-11-17 14:13:58 UTC
Permalink
AntyDesk escribió en mensaje ...
Post by AntyDesk
Como puedo capturar las teclas pulsadas directamente (sin utilizar
scanf ni nada de eso) ?
habia pensado lellendo en las direcciones de memoria de las teclas
alguien me puede decir como hacerlo?
gracias de antemano.
A mi tambien me interesa. No sabia que las teclas tuviesen direcciones
de memoria!!!. ;-)

Un saludo,
Martin.
otroYo
2003-11-17 14:56:06 UTC
Permalink
Y no las tienen. Por lo menos antes y creo que ahora también con DirectX
lo que se hacía era modificar la interrupción que trata las pulsaciones de
teclado.

Cuando se pulsa una tecla se produce lo que se llama una interrupción. En
ese momento el procesador deja, si puede, de hacer lo que esté haciendo
para tratar esa interrupción. Para saber lo que tiene que hacer mira en
una zona de memoria que se conoce como vector de interrupción y mira la
dirección en la que se encuentra la rutina para trarar las señales del
teclado.

Para los juegos en los que había que tener mas de una tecla pulsada a la
vez (casi todos) se modificaba esa rutina para que en vez del tratamiento
normal escribiese en una posición de memoria si una tecla estaba pulsada o
no. De sea forma se podían hacer programas que puslasen mas de una tecla a
la vez.

Hacer una rutina de interrupción no es moco de pavo. Si la haces mal el
treclado deja de funcionar y hay que reiniciar el equipo. Si la idea es
para un juego te recomiendo que mires las DirectX que tienen esa
funcionalidad o que pruebes las librerías de Allegro son GNU y están muy
bien, seguro que en google salen.


On Mon, 17 Nov 2003 15:13:58 +0100, Martin J. Sanchez
Post by Martin J. Sanchez
AntyDesk escribió en mensaje ...
Post by AntyDesk
Como puedo capturar las teclas pulsadas directamente (sin utilizar
scanf ni nada de eso) ?
habia pensado lellendo en las direcciones de memoria de las teclas
alguien me puede decir como hacerlo?
gracias de antemano.
A mi tambien me interesa. No sabia que las teclas tuviesen direcciones
de memoria!!!. ;-)
Un saludo,
Martin.
AntyDesk
2003-11-17 15:38:48 UTC
Permalink
OtroYo me interesa que sea directamente del pc ¿me puedes poner un
ejemplo que capture una tecla para ver mas o menos como es ?

Me interesa que lo haga por la interupción

gracias de antemano.
otroYo
2003-11-17 16:10:57 UTC
Permalink
Como te he dicho esta técnica se usa sobre todo para juegos. No te puedo
poner un ejemplo de lo que te cuento. Mas que nada porque hace muchos años
que no intento programar juegos. la interrupción de teclado normal lee las
pulsaciones y las almacena en el buffer de teclado. Por eso cuando dejas
pulsada una tecla mucho rato el PC se pone a pitar. Eso signifia que el
buffer está lleno. scanf, cin y demás leen de ese buffer. De modo que si
modificas la rutina de teclado a pelo estas funciones dejan de funcionar.
Esto era cierto por lo menos para MS-DOS. Al cambiar la rutina lo que
haces es definir un vector en que cada elemento representa una tecla. Cada
vez que una tecla se pulsa se modifica el estado de su elemento en el
vector. Cuando se deja de pulsar (eso también genera una interrupción) se
vuelve a cambiar. De este modo, cuando quieras saber si una tecla está
pulsada solo tienes que mirar en su posición en el vector.

Creo que ya te han dado algunos consejos para multiplataforma. Allegro el
multiplataforma y DirectX obviamente no. Pero solo son soluciones si lo
que buscas es algo parecido a un juego.
Post by AntyDesk
OtroYo me interesa que sea directamente del pc ¿me puedes poner un
ejemplo que capture una tecla para ver mas o menos como es ?
Me interesa que lo haga por la interupción
gracias de antemano.
Fer#
2003-11-18 08:01:01 UTC
Permalink
el dia de autos de Lunes, 17 de Noviembre de 2003 16:38, AntyDesk dijo en
OtroYo me interesa que sea directamente del pc ¿me puedes poner un
ejemplo que capture una tecla para ver mas o menos como es ?
Me interesa que lo haga por la interupción
gracias de antemano.
Es el ejemplo del que os dado la direccion en el otro hilo, pero abte la
insistencia de tenerlo todo mascaito...
--
fer# linux user 298351
AntyDesk
2003-11-17 15:33:57 UTC
Permalink
En realidad no estoy seguro pero me parece que si
vi algo en visualbasic si quieres agregame al msn y lo hacemos juntos
mi e-mail es ***@hotmail.com
Fernando Arbeiza
2003-11-17 15:32:08 UTC
Permalink
Post by AntyDesk
Como puedo capturar las teclas pulsadas directamente (sin utilizar
scanf ni nada de eso) ?
La respuesta corta es sencilla, en C no se puede; es decir, no se puede
sin utilizar elementos externos al lenguaje.

La respuesta larga es muy larga para lo vago que estoy hoy ;-) Confiaré
en que entiendes el inglés:

<URL: http://www.eskimo.com/~scs/C-faq/q19.1.html>

(Eh, si no entiendes el inglés dilo, que se hace un esfuerzo :-)

Ahora, si quieres una respuesta OT (porque la librería ncurses no
funciona en todos los sistemas), prueba la función getch. Si estás en un
sistema UN*X con la librería ncurses instalada, lee:

$ man getch
$ man cbreak

Un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
David J.
2003-11-17 16:05:49 UTC
Permalink
Que tal con la funcion 16h del BIOS?
Entrada AH=0
Salida AH = Codigo BIOS de rastreo
AL = Codigo ASCII de la tecla pulsada

Salu2.

DJ.
AntyDesk
2003-11-17 16:24:55 UTC
Permalink
me podias poner un ejemplo de como utilizo esas funciones de la
librterias bios ??
Fernando Arbeiza
2003-11-17 15:57:50 UTC
Permalink
Post by AntyDesk
Como puedo capturar las teclas pulsadas directamente (sin utilizar
scanf ni nada de eso) ?
Como tengo un ratito y tenía un ejemplo parecido espero que te sirva
alguna de estas tres formas de hacerlo. Ojo, las respuestas que te voy a
dar son muy Unix-céntricas (y, en mi opinión, bastante fuera de
temática).

La primera es la más sencilla, y la única que sólo utiliza funciones
estándar de C (aunque con una pequeña trampa, necesitas el comando
stty):

/**************/
/* con_stty.c */

#include <stdlib.h>
#include <stdio.h>

#define CBREAK_ON "stty cbreak"
#define CBREAK_OFF "stty -cbreak"

int main(void) {
char caracter;

system(CBREAK_ON);
caracter = fgetc(stdin);
system(CBREAK_OFF);
printf("\nHas tecleado: %c\n", caracter);

return 0;
}

/**************/

La siguiente necesita la librería ncurses:

/*****************/
/* con_ncurses.c */

#include <ncurses.h>

int main(void) {
char caracter;

initscr();
cbreak();

caracter = getch();
printw("\nHas tecleado: %c\n", caracter);

refresh();
getch();

nocbreak();
endwin();

return 0;
}

/*****************/

Y ya, la última, necesita utilizar funciones POSIX:

/***************/
/* con_posix.c */

#include <stdio.h>

#include <unistd.h>
#include <termios.h>

void canon_toggle(void) {
struct termios settings;
tcgetattr(0, &settings);
settings.c_lflag = settings.c_lflag ^ ICANON;
tcsetattr(0, TCSANOW, &settings);
}

int main(void) {
char caracter;

canon_toggle();
caracter = fgetc(stdin);
canon_toggle();
printf("\nHas tecleado: %c\n", caracter);

return 0;
}

/***************/

Ojo, que ninguno de los programas tiene comprobaciones de error.

Espero que te sirva de algo, un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
AntyDesk
2003-11-17 16:31:11 UTC
Permalink
Necesito que capture en segundo plano no en primero entendeis ??
Fernando Arbeiza
2003-11-17 22:20:24 UTC
Permalink
Post by AntyDesk
Necesito que capture en segundo plano no en primero entendeis ??
Más o menos. De todas formas, si es un problema de manejo de terminal,
creación de procesos o sincronización de procesos, te podrán ayudar
mucho mejor en un grupo específico a tu sistema operativo:

<URL: news:es.comp.os.linux.programacion>
<URL: news:es.comp.os.ms-windows.programacion>

O, si no es ninguno de los anteriores:

<URL: news:es.comp.os.misc>

Un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Fer#
2003-11-18 07:56:45 UTC
Permalink
el dia de autos de Lunes, 17 de Noviembre de 2003 17:31, AntyDesk dijo en
Post by AntyDesk
Necesito que capture en segundo plano no en primero entendeis ??
Busca aguien infectado con el loveletter y te lo descompilas, no, ya en
serio, hay un profesor de la UAM que propone un ejercicio que es un
programa residente (como los demonios de linux) que "cuenta" las
pulsaciones de un empleado, para que su jefe sepa si esta trabajando o no,
con pocas modificaciones te valdría, pero es ensamblador.

http://www.ii.uam.es/~kostadin/etc2/index.html

Es su página para la asignatura de
"Estructura y Tecnologia de Computadores 2"

No esperes que esté fácil, el ensamblador es la lengua materna de este tío.
--
fer# linux user 298351
cyfuss
2003-11-17 23:20:06 UTC
Permalink
El Mon, 17 Nov 2003 13:32:01 GMT, AntyDesk escribió en es.comp.lenguajes.c...:
# Como puedo capturar las teclas pulsadas directamente (sin utilizar
# scanf ni nada de eso) ?
#
# habia pensado lellendo en las direcciones de memoria de las teclas
#
# alguien me puede decir como hacerlo?
#
# gracias de antemano.
ete1
2003-11-17 23:53:58 UTC
Permalink
Paso por aquí con frecuencia y llevo ya dos semanas,
o más, viendo el hilo de "Capturar teclas pulsadas".

Demasiado tiempo para tan poco cosa.

Perdonad, por la respuesta un poco impertinente.

Buen rollo.
Post by cyfuss
El Mon, 17 Nov 2003 13:32:01 GMT, AntyDesk escribió en
# Como puedo capturar las teclas pulsadas directamente (sin utilizar
# scanf ni nada de eso) ?
#
# habia pensado lellendo en las direcciones de memoria de las teclas
#
# alguien me puede decir como hacerlo?
#
# gracias de antemano.
Loading...