ayuda con la API keybd_event

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

ayuda con la API keybd_event

Mensaje 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!
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: ayuda con la API keybd_event

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

Re: ayuda con la API keybd_event

Mensaje 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.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: ayuda con la API keybd_event

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

Re: ayuda con la API keybd_event

Mensaje 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.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: ayuda con la API keybd_event

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

Re: ayuda con la API keybd_event

Mensaje por Ximorro »

Hay que leerse las ayudas que también están en castellano...

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

ciaoooooo
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Responder