Hooks.dll - librería para todo tipo de hooks en AutoIt
Publicado: 05 Abr 2011, 20:09
Hola
Ha costado, pero al fin está terminada. :).
Con el rollo de capturar tooltips, que hablábamos en otro hilo, me he tirado bastante tiempo...
Primero, hice una UDF en AutoIt, que practicamente resolvía el problema. Solo tenía una limitación, y es que si el tooltip aparecía menos de quince milisegundos en pantalla (poco usual en cualquier aplicación :) ) lo detectaba, pero no le daba tiempo a capturar el texto. Además, me di cuenta, que después de haberla hecho con el trabajo que me llevó, no sabía como detectar a qué control pertenecía el tooltip que había capturado (eso también necesitaba saberlo).
¿Se puede con AutoIT?: Quizá sí, pero yo no lo conseguí.
Así pues, como no encontré la forma de detectar a qué control pertenecía un tooltip por más que busqué y busqué, y como tampoco me convencía la idea de que algunos tooltips (por pocos que fueran) pudieran escapársele al programa, busqué otra solución.
Leyendo el post donde preguntaba como capturar los malditos tooltips, vi que Chefito decía que una manera era capturar los mensajes de Windows y así lo hice como comenté por aquel post, sin buenos resultados.
Pero, estaba un poco más cerca:
Se trataba de capturar los mensajes de Windows para detectar los tooltips. La única forma que vi para hacer eso, era tirando de APIS (como no) :).
En concreto, había que usar "SetWindowsHooksEx" como indica la msdn, pero había un pequeño problema: Los hooks de mensajes requieren que el callback que invoca la API esté en una dll.
(imagino que ¿por eso Chefito diría que era muy complicado?...
Así qué, dándole vueltas a como solucionar eso, que en un principio no parecía tener solución, se me ocurrió: Hacer una dll, donde estuviera el callback al que invocara "SetWindowsHooksEx" y que a su vez ese callback invocara a uno de AutoIt. Así, tenía que funcionar...
Teniendo en cuenta que hacía años y años que había estudiado algo de C++ y que aún recordaba varias cosas, le di un buen repaso a un buen manual que tengo de C++ y me puse manos a la obra.
Al final, con más trabajo del que esperaba, he conseguido hacer la dll que funciona casi tal como quería. Digo casi, porque lo importante que es el callback que comunica la API con la aplicación de AutoIt funciona bien, así como el resto de funciones. Lo único, es, que algunas funciones de poca importancia, que devuelven información de la dll, no he podido hacer que funcionen tal como quería: devolviendo la información en estructuras en vez de como lo hacen, al estilo de las APIS de Windows (intentaré modificarlo en futuras versiones si a alguien le interesa la dll).
En cualquier caso, eso es insignificante, pues el único inconveniente es que la dll ocupa un poco más, pero no mucho más.Quizá este no sea del todo el sitio de este mensaje pero como es algo hecho para AutoIt aunque sea en otro lenguaje...
Si debería ir en otro sitio SORRY :).
Quizá no os haga falta la dll, pero os la cuelgo aquí por si a alguien le puede servir algún día. Con ella, ahora es fácil capturar eventos del sistema, incluso sirve para trabajar con cualquier tipo de hook, no solo de mensajes.
Como veréis en la documentación que he hecho sobre la dll, en realidad teniendo en cuenta cuatro cosas simples, la dll se puede usar para comunicar dos aplicaciones. No tiene quizá demasiado sentido, si la misma persona ahce los dos programas, pues hará por invocar el callback de autoit de forma que no haga falta una dll, pero si por algún motivo el callback invocado ha de estar en una dll, esta puede servir si las aplicaciones respetan la sintaxis del callback de la dll, que es el que exige la API "SetWindowsHooksEx". Además, ya que hice la consulta, que menos que decir que ya lo casi solucioné y el como :).
Creo, que la documentación está bien explicada, y que los ejemplos que he puesto también se entienden bien...
Veréis, que en Hooks_Example.au3, hay un bugg que todavía no he sabido arreglar, pero no creo que sea cosa de la dll ( a saber por qué pasa ).
También adjunto la UDF que hice para gestionar los tooltips, por si a alguien le interesa, ya que la que lleva AutoIt la veo bastante complicada (yo no he sabido usarla del todo bien) :) y esta es funcional, salvo el bugg que comento más arriba.
Ahora solo falta estudiar los mensajes y hacer código para tratarlos. Al menos, la captura que era lo difícil ya está hecha.
espero, que no siga resistiéndose mucho más... :P.
Salu2!
Ha costado, pero al fin está terminada. :).
Con el rollo de capturar tooltips, que hablábamos en otro hilo, me he tirado bastante tiempo...
Primero, hice una UDF en AutoIt, que practicamente resolvía el problema. Solo tenía una limitación, y es que si el tooltip aparecía menos de quince milisegundos en pantalla (poco usual en cualquier aplicación :) ) lo detectaba, pero no le daba tiempo a capturar el texto. Además, me di cuenta, que después de haberla hecho con el trabajo que me llevó, no sabía como detectar a qué control pertenecía el tooltip que había capturado (eso también necesitaba saberlo).
¿Se puede con AutoIT?: Quizá sí, pero yo no lo conseguí.
Así pues, como no encontré la forma de detectar a qué control pertenecía un tooltip por más que busqué y busqué, y como tampoco me convencía la idea de que algunos tooltips (por pocos que fueran) pudieran escapársele al programa, busqué otra solución.
Leyendo el post donde preguntaba como capturar los malditos tooltips, vi que Chefito decía que una manera era capturar los mensajes de Windows y así lo hice como comenté por aquel post, sin buenos resultados.
Pero, estaba un poco más cerca:
Se trataba de capturar los mensajes de Windows para detectar los tooltips. La única forma que vi para hacer eso, era tirando de APIS (como no) :).
En concreto, había que usar "SetWindowsHooksEx" como indica la msdn, pero había un pequeño problema: Los hooks de mensajes requieren que el callback que invoca la API esté en una dll.
(imagino que ¿por eso Chefito diría que era muy complicado?...
Así qué, dándole vueltas a como solucionar eso, que en un principio no parecía tener solución, se me ocurrió: Hacer una dll, donde estuviera el callback al que invocara "SetWindowsHooksEx" y que a su vez ese callback invocara a uno de AutoIt. Así, tenía que funcionar...
Teniendo en cuenta que hacía años y años que había estudiado algo de C++ y que aún recordaba varias cosas, le di un buen repaso a un buen manual que tengo de C++ y me puse manos a la obra.
Al final, con más trabajo del que esperaba, he conseguido hacer la dll que funciona casi tal como quería. Digo casi, porque lo importante que es el callback que comunica la API con la aplicación de AutoIt funciona bien, así como el resto de funciones. Lo único, es, que algunas funciones de poca importancia, que devuelven información de la dll, no he podido hacer que funcionen tal como quería: devolviendo la información en estructuras en vez de como lo hacen, al estilo de las APIS de Windows (intentaré modificarlo en futuras versiones si a alguien le interesa la dll).
En cualquier caso, eso es insignificante, pues el único inconveniente es que la dll ocupa un poco más, pero no mucho más.Quizá este no sea del todo el sitio de este mensaje pero como es algo hecho para AutoIt aunque sea en otro lenguaje...
Si debería ir en otro sitio SORRY :).
Quizá no os haga falta la dll, pero os la cuelgo aquí por si a alguien le puede servir algún día. Con ella, ahora es fácil capturar eventos del sistema, incluso sirve para trabajar con cualquier tipo de hook, no solo de mensajes.
Como veréis en la documentación que he hecho sobre la dll, en realidad teniendo en cuenta cuatro cosas simples, la dll se puede usar para comunicar dos aplicaciones. No tiene quizá demasiado sentido, si la misma persona ahce los dos programas, pues hará por invocar el callback de autoit de forma que no haga falta una dll, pero si por algún motivo el callback invocado ha de estar en una dll, esta puede servir si las aplicaciones respetan la sintaxis del callback de la dll, que es el que exige la API "SetWindowsHooksEx". Además, ya que hice la consulta, que menos que decir que ya lo casi solucioné y el como :).
Creo, que la documentación está bien explicada, y que los ejemplos que he puesto también se entienden bien...
Veréis, que en Hooks_Example.au3, hay un bugg que todavía no he sabido arreglar, pero no creo que sea cosa de la dll ( a saber por qué pasa ).
También adjunto la UDF que hice para gestionar los tooltips, por si a alguien le interesa, ya que la que lleva AutoIt la veo bastante complicada (yo no he sabido usarla del todo bien) :) y esta es funcional, salvo el bugg que comento más arriba.
Ahora solo falta estudiar los mensajes y hacer código para tratarlos. Al menos, la captura que era lo difícil ya está hecha.
espero, que no siga resistiéndose mucho más... :P.
Salu2!