Página 1 de 1

Capturar tecla pulsada

Publicado: 14 Feb 2011, 05:36
por Marcelo
Hola, estoy intentando hacer una aplicacion que se utiliza solamente con el teclado.
Hasta ahora vengo usando HotKeySet, pero me estoy metiendo en un terrible rollo cuando me meto dentro de diferentes funciones teniendo que deshabilitar y habilitar las hotkeys.

Es posible esperar por una tecla y saber cual ha sido la pulsada?

el ejemplo de lo que necesito sería algo así:

Código: Seleccionar todo

while 1
       $Tecla = TeclaPulsada()
       Select
            case $Tecla = "UP"
                   subo()
            case $Tecla = "DOWN"
                   bajo()
            case $Tecla = "ENTER"
                   enter()
            case $Tecla = "Esc"
                   Exit
       EndSelect
wend

Re: Capturar tecla pulsada

Publicado: 14 Feb 2011, 10:56
por Ximorro
Sí, se puede hacer por ejemplo con la función _IsPressed, en misc.au3. A esta función le pasas un código de tecla y te dice si está pulsada (por cierto, que también hay códigos para los botones del ratón, así que con la misma función también puedes mirar eso).
Los códigos los ves en la ayuda de la función _IsPressed.

Tu código podría traducirse a esto (yo pongo unos ConsoleWrite para que me vaya mostrando lo que va haciendo, tú tendrías tus funciones subo(), bajo(), etc.:

Código: Seleccionar todo

#include <Misc.au3>

Global $UserDLL = DllOpen("user32.dll")
While 1
	If _IsPressed("25", $UserDLL) Then ; Cursor izquierda
		ConsoleWrite("IZQUIERDA" & @LF)
	ElseIf _IsPressed("27", $UserDLL) Then ; Cursor derecha
		ConsoleWrite("DERECHA" & @LF)
	EndIf
	If _IsPressed("26", $UserDLL) Then ; Cursor arriba
		ConsoleWrite("ARRIBA" & @LF)
	ElseIf _IsPressed("28", $UserDLL) Then ; Cursor abajo
		ConsoleWrite("ABAJO" & @LF)
	EndIf
	If _IsPressed("1B", $UserDLL) Then ; Escape
		ConsoleWrite("ESCAPE, saliendo..." & @LF)
		ExitLoop
	EndIf
	Sleep(50)
WEnd
DllClose($UserDLL)
Exit
Tal como lo he puesto también coge diagonales, si pulsas cursor arriba y derecha verás en la consola que va alternando los dos mensajes. No le dejo pulsar por ejemplo izda y derecha a la vez, pero vaya, eso es cosa de diseño. tú ponlo con la funcionalidad que te interese.
Como hago un DllOpen para que sea más eficiente el acceso a la librería, hay que acordarse de hacer un DllClose al salir.
El Sleep(50) es para que no se hunda la CPU esperando el teclado.

Re: Capturar tecla pulsada

Publicado: 14 Feb 2011, 15:32
por Marcelo
Perfecto, lo único que encontraba en el help era justamente _ispressed() pero se me hacía que si lo ponía así dentro de un loop iba a dejar muy saturado todo, pero si vale... vale!
Por eso me preguntaba si existía una función que esperase a que una tecla sea pulsada y me devuelva su valor.... Pero bueno, veremos como se porta _ispressed()

Muchas gracias!

Marcelo

Re: Capturar tecla pulsada

Publicado: 15 Feb 2011, 09:10
por Ximorro
Pues no, que yo sepa no hay nada que se quede esperando a que se pulse una tecla. Hay cosas para mirar las teclas, pero la espera la tienes que programar tú ;-)

Re: Capturar tecla pulsada

Publicado: 15 Feb 2011, 13:57
por BasicOs
Marcelo escribió:_ispressed() pero se me hacía que si lo ponía así dentro de un loop iba a dejar muy saturado todo, pero si vale... vale!
Por eso me preguntaba si existía una función que esperase a que una tecla sea pulsada y me devuelva su valor.... Pero bueno, veremos como se porta _ispressed()
Marcelo
La espera puedes programar como quieras,como dice Ximorro, con el sleep() para que no use la máquina, puedes poner un sleep(500) cada medio segundo o como allí cada 50 milisegundos. Por otro lado también HOTKEYSET() -> con función,
Salu22:)

Re: Capturar tecla pulsada

Publicado: 17 Feb 2011, 05:25
por Marcelo
Muchas gracias!! Funciona muy bien, lo único que debería hacer sería evitar las repeticiones dentro del bucle, por ahora lo vengo manejando con Sleep, esto depende de la cantidad de datos que "mueva" en cada pulsada de teclas. Por ejemplo, si solo actualizo un label esto es rapidísimo y tengo repeticiones, si en cambio cargo alguna imagen grande anda al pelo..
Hay alguna función para vaciar el buffer de teclado?

Re: Capturar tecla pulsada

Publicado: 17 Feb 2011, 09:27
por Ximorro
Para evitar repeticiones puedes almacenar en una variable el último código presionado. Si el código de la nueva tecla coincide con ese código la ignoras. Así evitas las repeticiones y sólo procesas cuando llegue una tecla diferente.

Creo que con IsPressed no tienes problemas con bufers de teclado, pues esta función mira si la tecla que le dices se está pulsando justo en ese momento. No te da la última tecla que se presionó, si no lo dices en el momento de la pulsación no la ves.

Re: Capturar tecla pulsada

Publicado: 17 Feb 2011, 17:57
por Marcelo
Tenés razón, al fijarse si la tecla esta pulsada no tengo que impiar el buffer sino simplemente darle el tiempo necesario a que no compruebe más de una vez en lo que dura una tecla apretada. Eso lo manejo con sleep.
Muchísismas gracias!!

Re: Capturar tecla pulsada

Publicado: 19 Feb 2011, 00:29
por Chefito
Hombre, hay otra forma para hacer esto, lo que pasa que no es para iniciados. El código es bastante complicado. Puedes hacerlo con hook (ganchos) al teclado. Aquí en el foro se ha hablado mucho de esto y otros temas del teclado.

Utiliza el buscador del foro para estas cosas. Está en la parte superior derecha por si no lo habías visto.

Busqua cosas como "capturar tecla","anular tecla","hook","tecla",etc. Verás que te salen posts muy interesantes que te pueden servir para tu propósito.

Saludos.