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!
Hooks.dll - librería para todo tipo de hooks en AutoIt
Hooks.dll - librería para todo tipo de hooks en AutoIt
- Adjuntos
-
AutoIt Hooks.rar
- (15.98 KiB) Descargado 344 veces
Re: Hooks.dll - librería para todo tipo de hooks en AutoIt
Hola
De nada
:P.
Por cierto, que acabo de comprobar que todo funciona bien.
El bugg que comento en el código de ejemplo que puse, en un soft que estoy haciendo me ha dado por probarlo y funciona bien con el bucle de mantenimiento del programa. ¿Quizá porque el callback, las llamadas a la dll y el bucle están en ficheros diferentes?... A saber :). Pero me alegra saber que funciona todo correctamente.
:)
Salu2!
De nada
:P.
Por cierto, que acabo de comprobar que todo funciona bien.
El bugg que comento en el código de ejemplo que puse, en un soft que estoy haciendo me ha dado por probarlo y funciona bien con el bucle de mantenimiento del programa. ¿Quizá porque el callback, las llamadas a la dll y el bucle están en ficheros diferentes?... A saber :). Pero me alegra saber que funciona todo correctamente.
:)
Salu2!
- Chefito
- Profesional del Autoit
- Mensajes: 2035
- Registrado: 21 Feb 2008, 18:42
- Ubicación: Albacete/Cuenca (España)
Re: Hooks.dll - librería para todo tipo de hooks en AutoIt
Muy buena la idea de intentar hacer una dll externa para capturar los mensajes de windows. Yo en su día también leí algo de eso por algún foro.
La verdad es que no he trabajado apenas con la api SetWindowsHooksEx. Solamente para capturar mensajes de teclado y ratón, ya que los otros siempre me devolvían 0 (tampoco los he mirado a fondo). Por eso te dije que era un tema dificil.
Respecto a tu ejemplo, parece ser que no tira en windows 7. Yo lo he probado en un w7 64bits y me ha dado este error:
Por cierto, que se supone que debe hacer el ejemplo????
Saludos y buena currada
.
La verdad es que no he trabajado apenas con la api SetWindowsHooksEx. Solamente para capturar mensajes de teclado y ratón, ya que los otros siempre me devolvían 0 (tampoco los he mirado a fondo). Por eso te dije que era un tema dificil.
Respecto a tu ejemplo, parece ser que no tira en windows 7. Yo lo he probado en un w7 64bits y me ha dado este error:
Te lo digo por si lo quieres mirar. Piensa que ya mucha gente está migrando al w7 y vamos a tener que hacer los códigos compatibles con los dos SO. Luego lo intentaré correr en un xp.>Running:(3.3.6.1):C:\Program Files (x86)\AutoIt3\autoit3_x64.exe "C:\Users\Manuel\Desktop\AutoIt Hooks\Hooks_Example.au3"
C:\Users\Manuel\Desktop\AutoIt Hooks\Hooks_Example.au3 (32) : ==> Subscript used with non-Array variable.:
$Hook=DllCall($User32DLL, "hwnd", "SetWindowsHookEx", "int", $WH_CALLWNDPROC, "ptr", $CallbackLocalHandle[0], "hwnd", $Module[0], "dword", 0)
$Hook=DllCall($User32DLL, "hwnd", "SetWindowsHookEx", "int", $WH_CALLWNDPROC, "ptr", $CallbackLocalHandle^ ERROR
->18:24:38 AutoIT3.exe ended.rc:1
>Exit code: 1 Time: 1.956
Por cierto, que se supone que debe hacer el ejemplo????
Saludos y buena currada


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 ;).
Re: Hooks.dll - librería para todo tipo de hooks en AutoIt
Hola
Vaya, en XP funciona bien....
Lo se, de hecho intento hacer código que valga para XP, Vista o Siete, pero yo aún me resisto a abandonar al XP :) y no tengo Win Siete.
Tendré que instalar un windows siete para probar los programas... Habría que ver que devuelve DllCall() en @Error, para empezar a ver de donde viene el problema.
De todas formas, aunque diría que el ejemplo que hice está bien planteado no se por qué no termina de funcionar; como dije, con un While 1 ... Wend, el callback de la dll sí se ejecuta, pero no invoca bien al callback de autoit, pero no creo que sea de la dll, porque como digo esta sí se ejecuta...
el ejemplo en realidad hacer lo que se dice hacer, nada útil :). Solo era para que viérais como implementar las funciones más importantes de la dll, sin tener que leer la documentación :P.
Por cierto, he visto que para capturar tooltips o cualquier mensaje, es mejor un gancho de tipo $WH_GETMESSAGE que el que puse en el ejemplo; que pensé que sería el correcto, pero he visto que a veces hay cosas que no notifica "SetWindowsHooksEx".
Ahora la cosa está en el tratamiento de los mensajes, para detectar cuando son tooltips, de donde vienen etc. Espero, que así pueda detectarlos bien y saber de que control vienen; sino me doy un tiro :).
Pero llevará tiempo estudiar eso de los mensajes; sobre todo, porque también hay que hacer eso del low word y high word...
:)
Salu2!
Vaya, en XP funciona bien....
Lo se, de hecho intento hacer código que valga para XP, Vista o Siete, pero yo aún me resisto a abandonar al XP :) y no tengo Win Siete.
Tendré que instalar un windows siete para probar los programas... Habría que ver que devuelve DllCall() en @Error, para empezar a ver de donde viene el problema.
De todas formas, aunque diría que el ejemplo que hice está bien planteado no se por qué no termina de funcionar; como dije, con un While 1 ... Wend, el callback de la dll sí se ejecuta, pero no invoca bien al callback de autoit, pero no creo que sea de la dll, porque como digo esta sí se ejecuta...
el ejemplo en realidad hacer lo que se dice hacer, nada útil :). Solo era para que viérais como implementar las funciones más importantes de la dll, sin tener que leer la documentación :P.
Por cierto, he visto que para capturar tooltips o cualquier mensaje, es mejor un gancho de tipo $WH_GETMESSAGE que el que puse en el ejemplo; que pensé que sería el correcto, pero he visto que a veces hay cosas que no notifica "SetWindowsHooksEx".
Ahora la cosa está en el tratamiento de los mensajes, para detectar cuando son tooltips, de donde vienen etc. Espero, que así pueda detectarlos bien y saber de que control vienen; sino me doy un tiro :).
Pero llevará tiempo estudiar eso de los mensajes; sobre todo, porque también hay que hacer eso del low word y high word...
:)
Salu2!