Página 1 de 1

ayuda con la API keybd_event

Publicado: 02 Nov 2010, 22:24
por Jonny
Hola

Quiero activar/desactivar el teclado numérico (como si se pulsara la tecla bloq. num) en un programa. He visto, que la mejor forma de hacerlo es con la API keybd_event, ya que con sendkey.... no parece funcionar bien. Además, quisiera desactivarlo o activarlo, independientemente del estado, no simular la pulsación de bloq. num, para cambiar el estado.

He estado buscando, y he encontrado esta página:

http://www.canalvisualbasic.net/foro/vi ... -num-5371/

Entre que es VB (que se muy poco de ese lenguaje) y que no se de donde se sacan los argumentos que le pasan a keybd_event, ni para qué ponen esas constantes, no he conseguido hacer que funcione.

Entonces, he buscado la función en la msdn:

http://msdn.microsoft.com/en-us/library/ms646304

Pero tampoco me ha solucionado mucho, me parece a mi.

Entre unas cosas y otras, esto es lo que he hecho:

Código: Seleccionar todo

$SetKey=DllCall("User32.DLL", "none", "keybd_event", "byte", 145, "byte", "H45", "long", "H1", "long", 0)
Como os podeis imaginar, no funciona.
Entiendo por la msdn, que no devuelve nada la función, pero a mi me devuelve -127 o algo así...

Eso sí, @Error vale 0 después de DllCall()

¿Sabeis como hacer esto?

Acias,

Salu2!

Re: ayuda con la API keybd_event

Publicado: 03 Nov 2010, 13:20
por Jonny
Hola

Al fin, he conseguido hacer andar a la maldita api...

No como me imaginaba que funcionaría, pero al menos he conseguido el objetivo.

Y todo, gracias a esta web:

http://www.recursosvisualbasic.com.ar/h ... ndkeys.htm

El código lo he entendido un poco mejor que en la anterior que puse ayer... Y he visto, que uno de los parámetros que no sabía que pasarle, no es necesario pasarle nada (el segundo) el código de escaneo de la tecla.

Así pues, no funciona como yo esperaba, que desactivara o activara el bloqueo del teclado numérico independientemente de su estado, si no, que envía la tecla Bloq. num (simula la pulsación). Entonces, solo hay que comprobar antes con GetKeyState el estado de la tecla: si está bloqueada, simular la pulsación para desbloquearla:

Código: Seleccionar todo

DllCall("User32.dll", "none", "keybd_event", "byte", 0x90, "int", 0, "int", 0, "int", 0)
DllCall("User32.dll", "none", "keybd_event", "byte", 0x90, "int", 0, "byte", 0x0002, "int", 0)
Así es como se simula la pulsación de una tecla con esta API, por si a alguien le interesa. Por lo visto, hay que llamar dos veces a la función, una para pulsar la tecla y otra para liberarla.

Puf, ¡malditas apis! :)

Salu2!

Re: ayuda con la API keybd_event

Publicado: 03 Nov 2010, 13:55
por Ximorro
¿Y qué tal un Send("{NUMLOCK off}") ? :smt003 :smt005

Ni hay que mirar si está activada o desactivada, la desactivas y punto. Y para qué "simular" que está desactivada, cuando la puedes desactivar de verdad...
Y no hace falta tocar APIs.

Re: ayuda con la API keybd_event

Publicado: 03 Nov 2010, 17:19
por Jonny
Anda...

Pues perfecto pero ¿Send() no envía la tecla a la aplicación activa?

Es por eso que no la utilicé... porque pensaba, que enviaba la tecla a la aplicación activa (he tilizado muy poco esta función de AutoIt desde que toco este lenguaje) y quería desactivar el bloqueo del teclado numérico fuera cual fuera la aplicación activa, pero me lo apunto, me ha gustado eso del "off", no sabía que pudiera especificarse el estado de la tecla, para que se pusiera en el estado que se quisiera. Pensaba, que a lo más, con esta función se podría simular la pulsación de la tecla (con lo que alternaría entre bloqueado/desbloqueado).

Ya que estamos, imagino que se haría lo mismo en el caso del bloqueo de mayúsculas y/o de desplazamiento ¿no? (por si alguna vez lo necesitara)...

Salu2!

Re: ayuda con la API keybd_event

Publicado: 04 Nov 2010, 09:07
por Ximorro
Send pulsa teclas como si las pulsaras tú. Afectará a una aplicación específica si esa aplicación tiene el foco del teclado, pero la tecla la envía "al sistema", no a la aplicación.
ControlSend sí envía a un control específico en una ventana concreta.

En vez de complicarte tanto con las APIs mírate la ayuda de esa función, para pulsaciones de teclas es muy completa. Resulta que yo tampoco sabía lo del off, fui a la ayuda a ver cómo se ponía {NUMLOCK} y me encontré con eso. Pero si no estuviera también se podría utilizar, mirando el estado de la tecla (para eso sí hace falta la API) y mandando el Send sólo si está activada.
Y por supuesto que {CAPSLOCK} y {SCROLLLOCK} también tienen on, off y toggle.

Re: ayuda con la API keybd_event

Publicado: 04 Nov 2010, 13:10
por Jonny
Hola

Sí, desde luego, así es más sencillo, aún teniendo que comprobar el estado con GetKeyState, pero si no hace falta ni eso ¡todavía mejor!

¿"toggle"?...

Salu2!

Re: ayuda con la API keybd_event

Publicado: 05 Nov 2010, 09:11
por Ximorro
Hay que leerse las ayudas que también están en castellano...

on, off, toggle: encender, apagar, conmutar.

ciaoooooo