Capturar tecla pulsada

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
Marcelo
Aprendiz de Mago
Mensajes: 34
Registrado: 29 Ene 2011, 18:13

Capturar tecla pulsada

Mensaje 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
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Capturar tecla pulsada

Mensaje 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.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Marcelo
Aprendiz de Mago
Mensajes: 34
Registrado: 29 Ene 2011, 18:13

Re: Capturar tecla pulsada

Mensaje 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
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Capturar tecla pulsada

Mensaje 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ú ;-)
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2085
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Capturar tecla pulsada

Mensaje 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:)
Marcelo
Aprendiz de Mago
Mensajes: 34
Registrado: 29 Ene 2011, 18:13

Re: Capturar tecla pulsada

Mensaje 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?
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Capturar tecla pulsada

Mensaje 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.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Marcelo
Aprendiz de Mago
Mensajes: 34
Registrado: 29 Ene 2011, 18:13

Re: Capturar tecla pulsada

Mensaje 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!!
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Capturar tecla pulsada

Mensaje 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.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Responder