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.