![]() |
Crear componente "Hook de ratón a nivel de sistema"
Buenas noches gente, ahi va mi duda les comento:
Ultimamente en mis aplicaciones implemento un hook de ratón para obtener las coordenadas y pulsaciones de éste, hasta tal punto que para facilitar el trabajo pense diseñar un componente que lo administre todo. Para implementar el hook de ratón a nivel de sistema en mi aplicación siempre utilicé una librería que encontre en un ejemplo de www.Q3.nu comentado en estos foros anteriormente. Para la creación de dicho componente utilizo ésta misma librería, por el momento el componente esta terminado y funciona, pero el problema me lo da Delphi al estar un tiempo usando el componente (no digo en tiempo de ejecución, sino en tiempo de diseño) o en el momento en el que cierro Delphi me salta un error interno de Delphi (si, de éstos que dice Enviar o No enviar) y pienso, ¿es un bug de Delphi? ¿es problema de mi componente? y... ¿por qué en el ejecutable de mi programa funciona perfectamente sin saltar ningun error? ¿es por implementar el uso de una librería en un componente? ¿:confused: ? El error concreto no me acuerdo pero en un momento abro delphi y comienzo a trabajar con el componente esperen.... ¡Ahí está, ya no se escapa!, por cierto ahora tuve que implementar el componente en el Form y a continuación cerrar Delphi para que apareciese el error y otra cosa muy curiosa es que entra en un ciclo interminable de errores, que le das a "No enviar" y te vuelve a aparecer el error hasta que das a Ctrl+Alt+Supr y finalizas el proceso de Delphi, el error es el siguiente: Código:
AppName: delphi32.exe AppVer: 5.0.5.62 ModName: unknown Código:
Runtime error 216 at 04221CC4 No he incorporado código por la razón de que me valdría una de estas 2 soluciones: -Saber si existe otra forma de obtener coordenadas de ratón a nivel de sistema y sus pulsaciones sin utilizar un DLL para poder implementarlo en un componente. -Saber si alguno de ustedes conoce algun componente que capture las coordenadas de ratón y pulsaciones gratuito y funcional. En caso de no existir ninguna de las soluciones mencionadas incorporaría código, componente y lo que haga falta. Muchas gracias de antemano por las posibles respuestas y el tiempo que se toman en leer mi duda :) |
Cita:
Si quieres un poco de código echale un vistazo a este otro hilo, ahí utilizo el hook para detectar el click del ratón, pero supongo que no tendrás dificultar en obtener las coordenadas. http://www.clubdelphi.com/foros/showthread.php?t=36672 |
Valla Seoane muchas gracias por tu respuesta :D me pondré a echar un vistazo a ese código que tan amablemente me has dejado en el post y ya te comentaré si consigo solucionarlo.
|
Problemilla de tu ejemplo
Por cierto, WH_KEYBOARD? es un hook para el ratón por lo que en el ejemplo tuyo no tengo que cambiar nada (WH_MOUSE_LL)
Y bueno, probando pues si parece que funciona, pero veo algo curioso que no me gusta y es que en tu función, añadi una variable de tipo PMouseHookStruct con la cual obtengo las coordenadas del ratón, básicamente lo que hacía con la DLL (lo que me decias tu) : El problema está en que al obtener las coordenadas, cuando coges velocidad con el ratón y llegas al límite (yo tengo una resolucion de pantalla de 800x600 asi que pongamos como ejemplo 800 en el eje X) el valor que devuelve es superior a 800 (a veces si cojo mucha velocidad me devuelve 900 y a continuación se corrige él solo a 800, supongo que es al mover el ratón en sentido Y) y en sentido contrario comienza con números negativos (al llegar a 0 comienza con -1,-2...-100) Probé tambien usando
para ver si se corregía el error pero parece que no, ¿Por qué cuando usaba la DLL ésto no ocurría? ¿Qué cambia? ¿Debo corregirlo yo con una subrutina que detecte si supera ese valor o estoy haciendo algo mal:confused: ? De nuevo gracias por tu código Seoane |
Cita:
Cita:
Por cierto aunque el comienzo de la estructura es igual, deberías de usar la estructura TMSLLHOOKSTRUCT en vez de TMouseHookStruct.
|
Solucionado
Al final lo conseguí :) , tuve que comparar las coordenadas del ratón con TScreen para hacerlo y si al final lo conseguí, muchas gracias por tu atención Seoane:D
|
La franja horaria es GMT +2. Ahora son las 09:32:37. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi