Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-12-2006
Avatar de DarkMan
DarkMan DarkMan is offline
Miembro
 
Registrado: jul 2006
Posts: 102
Poder: 18
DarkMan Va por buen camino
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? ¿ ?
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
ModVer: 0.0.0.0 Offset: 04221cc4
Cuando no entra en un ciclo salta un error de Runtime:
Código:
Runtime error 216 at 04221CC4
Utilizo Delphi5 enterprise edition en un Windows XP Profesional.
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
__________________
"La recompensa de una buena acción está en haberla hecho"
Responder Con Cita
  #2  
Antiguo 10-12-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por DarkMan
-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.
Si existe un forma de hacerlo. Y seguro que es muy similar a la que estas utilizando ahora, solo que en vez de utilizar un hook del tipo WH_KEYBOARD debes de utilizar un hook del tipo WH_KEYBOARD_LL. Este ultimo se diferencia del primero en que no es inyectado en los otros procesos, si no que es llamado dentro del contexto del proceso que instala el hook. Esto simplifica mucho el código del hook y elimina la necesidad de utilizar una dll.

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
Responder Con Cita
  #3  
Antiguo 10-12-2006
Avatar de DarkMan
DarkMan DarkMan is offline
Miembro
 
Registrado: jul 2006
Posts: 102
Poder: 18
DarkMan Va por buen camino
Valla Seoane muchas gracias por tu respuesta 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.
__________________
"La recompensa de una buena acción está en haberla hecho"
Responder Con Cita
  #4  
Antiguo 10-12-2006
Avatar de DarkMan
DarkMan DarkMan is offline
Miembro
 
Registrado: jul 2006
Posts: 102
Poder: 18
DarkMan Va por buen camino
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) :

Código Delphi [-]
function MouseProc(Code: Integer; WParam:WPARAM ; LParam: LPARAM): LRESULT; stdcall;
var
   DatosMouse     : PMouseHookStruct;
begin
  if Code = HC_ACTION then
  begin
    DatosMouse:=Pointer(lparam);
      Form1.Label1.caption:=IntToStr(DatosMouse.pt.x);
      Form1.Label2.caption:=IntToStr(DatosMouse.pt.y);
  end;
  Result := CallNextHookEx(Hook, Code, WParam, LParam);
end;
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

Código Delphi [-]
if WParam = WM_MOUSEMOVE then

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 ?
De nuevo gracias por tu código Seoane
__________________
"La recompensa de una buena acción está en haberla hecho"
Responder Con Cita
  #5  
Antiguo 10-12-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por DarkMan
Por cierto, WH_KEYBOARD?
Es evidente que me equivoque, pero ya veo que me entendiste.

Cita:
Empezado por DarkMan
¿Por qué cuando usaba la DLL ésto no ocurría? ¿Qué cambia?
Pues parece que la cosa es así, con los movimientos bruscos parece que el ratón "sale" de la pantalla, y nosotros recibimos el mensaje antes de que windows pueda corregir su posición. Puede que esto sea debido a que este hook actúa a un nivel mas bajo que el otro (LL significa Low Level) antes de que se que se corrija el error, seguramente debido a la aceleración del ratón. De todas formas, esto no debería de ser un problema, y de serlo siempre podemos comparar las coordenadas con las del monitor (TScreen).

Por cierto aunque el comienzo de la estructura es igual, deberías de usar la estructura TMSLLHOOKSTRUCT en vez de TMouseHookStruct.
Código Delphi [-]
type
  TMSLLHOOKSTRUCT = packed record
    pt: TPoint;
    mouseData: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: int64;
  end;
  PMSLLHOOKSTRUCT = ^TMSLLHOOKSTRUCT;
Responder Con Cita
  #6  
Antiguo 10-12-2006
Avatar de DarkMan
DarkMan DarkMan is offline
Miembro
 
Registrado: jul 2006
Posts: 102
Poder: 18
DarkMan Va por buen camino
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
__________________
"La recompensa de una buena acción está en haberla hecho"
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como cambiar valores en la ventana "General" propiedades del sistema JuanErasmo API de Windows 52 17-02-2012 17:42:20
¿cuál es mejor: "close" o "application.terminate"? unreal4u Varios 5 05-03-2007 11:01:19
porque no me reconoce los caracteres "*" ni "%" cuando filtro mrmago Conexión con bases de datos 10 27-01-2006 04:21:16
Hook para Mouse y Teclado a nivel del Sistema COCOL API de Windows 2 22-02-2005 03:31:07
"Restaurar Sistema" de Win XP...elimina datos. Sergio J. Windows 9 04-11-2004 10:52:34


La franja horaria es GMT +2. Ahora son las 06:38:44.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi