Ir al contenido


Foto

Capturar el movimiento del Mouse ayuda...


  • Por favor identifícate para responder
27 respuestas en este tema

#1 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 04 julio 2015 - 08:32

buenas amigos, yo de nuevo aquí para pedirles una mano, como puedo hacer para saber cuando el mouse toque los lados de la pantalla, es decir cuando toque el borde superior o cualquiera de los lados de la pantalla me avise.

 

Desde ya gracias por sus ayudas :) :)


  • 0

#2 Nikolas

Nikolas

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 604 mensajes
  • LocationMar del Plata / Bs As / Argentina

Escrito 05 julio 2015 - 05:47

para un formulario:


php
  1. procedure TForm1.FormMouseEnter(Sender: TObject);
  2. begin
  3. showmessage('ENTRE AL FORM');


  • 0

#3 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 05 julio 2015 - 08:21

Gracias amigo Nikolas, esta interesante...


  • 0

#4 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 06 julio 2015 - 03:53

He estado investigando y parece ser que tengo que usar las coordenadas del mouse ... alguna sugerencia 27.gif


  • 0

#5 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 07 julio 2015 - 04:07

Deberás capturar la posición del ratón para los límites del contexto de dispositivo 0 (o sea la pantalla). Esto pudo haber cambiado, la verdad es que hace mucho no veo este tipo de información.

Además deberás tener en cuenta que no estés en un ambiente con pantallas múltiples, ya que el puntero se pasará a otra pantalla.

 

En Delphi mediante Vcl.Forms.TScreen podrás acceder al mouse a un nivel global.

En Lazarus también existe un componente TScreen, deberías averiguar como funciona.

 

Creo que por ahí anda la solución

 

Saludos


  • 0

#6 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 08 julio 2015 - 09:36

Gracias "cram" por tu información :) , de momento he tenido un pequeño avanze con el evento "OnMoveMouse" del FORM1.

Este es el código que uso:


php
  1. procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  2.   Y: Integer);
  3. begin
  4.    Label1.Caption := IntToStr(x) + ' ' + IntToStr(y);  // funciona

.

Pero como podría seguir el movimiento del mouse Globalmente y no solo dentro del Form1.  :mellow: :mellow:


  • 0

#7 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 08 julio 2015 - 11:05

Hace mucho tuve ese problema y como es extraño, no recuerdo exactamente como es, para pasarte un código claro.

Lo que puedo hacer es darte una guía.

Hay que capturar al ratón (ya que es un recurso compartido por todas las aplicaciones que están en ejecución incluso explorer (Windows).

 

El siguiente enlace explica muy bien el correcto uso de SetCapture y ReleaseCapture para permitirte comenzar una solución, además deberás usar las funciones de conversión de coordenadas ScreenToiClient o alguna otra parecida.

 

http://www.codeproje...-correctly-usua

 

Espero te sirva,

Saludos


  • 0

#8 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 08 julio 2015 - 11:25

Gracias amigo "Cram" lo revisaré.


  • 0

#9 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 09 julio 2015 - 06:47

Si tu entorno de trabajo es Windows, revisa la API GetCursorPos

 

 

Saludos.


  • 0

#10 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 10 julio 2015 - 03:17

he encontrado un pequeño ejemplo con la api mencionada por el amigo Escafandra, es un pequeño salto para un newbie como yo, pero un gran salto para la humanidad :)

Este es el código:


php
  1. uses
  2. , windows;
  3.  
  4. -------------
  5. procedure TForm1.Button1Click(Sender: TObject);
  6. var
  7. posiciondelcuy: TPoint;
  8. begin
  9.   GetCursorPos(posiciondelcuy);
  10.   label1.Caption := IntToStr(posiciondelcuy.x);
  11.   label2.Caption := IntToStr(posiciondelcuy.y);

.

 

Queda mejor en el Evento "OnMouseMove" del form1, pero como lo puedo hacer global, no solo para el form sino para toda la pantalla.

Espero sus sugerencias y apoyo :)  saludos.


  • 0

#11 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 10 julio 2015 - 03:39

La API GetCursorPos te devuelve las coordenadas absolutas, no del Form.

Revisa la traducción a delphi que hice de WinInfo, allí muestro como usarla.

Saludos.
  • 0

#12 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 10 julio 2015 - 03:49

Tiene razón amigo escafranda, pero como puedo hacer para capturarlas esas coodenadas y mostrarlas en un Label, la única manera que se me ocurrió era con el evento "OnMouseMove".


  • 0

#13 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 10 julio 2015 - 04:17

Esa es una buena opción. Depende de tus necesidades. Siempre puedes capturarlas usando la API en cualquier momento, depende de lo que necesites.


Saludos.
  • 0

#14 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 10 julio 2015 - 04:31

Lo que quisiera realizar es poder mostrar las coordenadas siempre, moviendo en cualquier posición el mouse y mostrar en un Label las coordenadas obtenidas en pleno movimiento, utilizando el evento "OnMouseMove" del form puedo realizarlo pero si retiro el mouse del form entonces se detiene el seguimiento de las coordenadas. :unsure:


  • 0

#15 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 10 julio 2015 - 04:54

Revisa esto. Hoy es tarde para mi, mañana te muestro como hacer un Hook al ratón.


Saludos.
  • 0

#16 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 10 julio 2015 - 05:13

ok lo haré


  • 0

#17 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 11 julio 2015 - 10:55

Te pongo un ejemplo con un Hook al ratón que hace lo que pretendes, pone las coordenadas en un label:

delphi
  1. var
  2. Form1: TForm1;
  3. hMouseHook: HHOOK;
  4.  
  5. implementation
  6.  
  7. {$R *.dfm}
  8.  
  9. function MouseEvent(nCode, wParam, lParam: Integer): Integer; stdcall;
  10. var
  11. Point: TPoint;
  12. begin
  13. if nCode>=0 then
  14. begin
  15. GetCursorPos(Point);
  16. Form1.Label1.Caption:= '(' + IntToStr(Point.X) + ', ' + IntToStr(Point.Y) + ')';
  17. end;
  18. Result:= CallNextHookEx(hMouseHook, nCode, wParam, lParam);
  19. end;
  20.  
  21. procedure TForm1.FormCreate(Sender: TObject);
  22. begin
  23. // Ponemos en marcha el Hook
  24. hMouseHook:= SetWindowsHookEx(WH_MOUSE_LL, @MouseEvent, HInstance, 0);
  25. end;
  26.  
  27. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  28. begin
  29. // Paramos el Hook
  30. UnhookWindowsHookEx(hMouseHook);
  31. end;
  32.  
  33. end.



Saludos.
  • 1

#18 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 11 julio 2015 - 11:32

Muchisimas gracias amigo escafandra, eres un maestro :) me funciona perfecto.

 

Le comento que al probarlo tuve dos inconvenientes pero pude solucionarlos de la siguiente manera:

 

1. La primer prueba me salió este error:   
unit1.pas(30,15) Error: Identifier not found "HHOOK"

Solución: le agregue el uses "windows"

 

2. Ya con el uses "windows" ahora me salió este error:

unit1.pas(59,33) Error: Identifier not found "WH_MOUSE_LL"

Solución: Investigando en la web, agregué este código para solucionarlo:


php
  1. Uses
  2.  . . . .  Windows;
  3.  
  4. const
  5. //WH_KEYBOARD_LL =13;
  6. WH_MOUSE_LL =14;
  7.  
  8. type
  9. ......

Agrego el código completo:


php
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   windows, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;    // agregue el uses "windows"
  9.  
  10. const
  11. //WH_KEYBOARD_LL =13;
  12. WH_MOUSE_LL =14;  // lo agregué para que funcione
  13.  
  14. type
  15.  
  16.   { TForm1 }
  17.  
  18.   TForm1 = class(TForm)
  19.     Label1: TLabel;
  20.     procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
  21.     procedure FormCreate(Sender: TObject);
  22.   private
  23.     { private declarations }
  24.   public
  25.     { public declarations }
  26.   end;
  27.  
  28. var
  29.   Form1: TForm1;
  30.   hMouseHook: HHOOK;
  31.  
  32. implementation
  33.  
  34. {$R *.lfm}
  35.  
  36. { TForm1 }
  37.  
  38. function MouseEvent(nCode, wParam, lParam: Integer): Integer; stdcall;
  39. var
  40.   Point:  TPoint;
  41. begin
  42.   if nCode>=0 then
  43.   begin
  44.     GetCursorPos(Point);
  45.     Form1.Label1.Caption:= '(' + IntToStr(Point.X) + ', ' + IntToStr(Point.Y) + ')';
  46.   end;
  47.   Result:= CallNextHookEx(hMouseHook, nCode, wParam, lParam);
  48.  
  49. procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
  50. begin
  51.     // Paramos el Hook
  52.   UnhookWindowsHookEx(hMouseHook);
  53.  
  54. procedure TForm1.FormCreate(Sender: TObject);
  55. begin
  56.    // Ponemos en marcha el Hook
  57.   hMouseHook:= SetWindowsHookEx(WH_MOUSE_LL, @MouseEvent, HInstance, 0);
  58.  

.

Ahora si me funciona. :)

Amigo Escafandra usted cree que esta bien estos códigos que he agregado, por favor corrijame de ser necesario.

 

 

 

 

 

 

 

 

 

 

 

 

 


  • 0

#19 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 11 julio 2015 - 12:49

Es así. Olvide que estabas con Lazarus, lógicamente debes añadir uses Windows. El valor de WH_MOUSE_LL es 14.

Saludos.
  • 0

#20 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 14 julio 2015 - 09:11

Muy bueno días con todos en este día hermoso :)

Les comento en especial al amigo Escafandra que  he agregado unos códigos al suyo para poder realizar lo que buscaba, poder saber cuando el mouse toca los lados de la pantalla.

 

Les comparto el código:


php
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   windows, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
  9.  
  10. const
  11. //WH_KEYBOARD_LL =13;
  12. WH_MOUSE_LL =14;
  13.  
  14. type
  15.  
  16.   { TForm1 }
  17.  
  18.   TForm1 = class(TForm)
  19.     GroupBox1: TGroupBox;
  20.     GroupBox2: TGroupBox;
  21.     Label1: TLabel;
  22.     Label2: TLabel;
  23.     Label3: TLabel;
  24.     Label4: TLabel;
  25.     Label5: TLabel;
  26.     Label6: TLabel;
  27.     procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
  28.     procedure FormCreate(Sender: TObject);
  29.   private
  30.     { private declarations }
  31.   public
  32.     { public declarations }
  33.   end;
  34.  
  35. var
  36.   Form1: TForm1;
  37.   hMouseHook: HHOOK;
  38.  
  39. implementation
  40.  
  41. {$R *.lfm}
  42.  
  43. { TForm1 }
  44.  
  45. function MouseEvent(nCode, wParam, lParam: Integer): Integer; stdcall;
  46. var
  47.   Point:  TPoint;
  48. begin
  49.   if nCode>=0 then
  50.   begin
  51.     GetCursorPos(Point);
  52.     Form1.Label1.Caption:= '(Horizontal X:  ' + IntToStr(Point.X) + ', Vertical Y:  ' + IntToStr(Point.Y) + ')';
  53.  
  54.        //if Point.Y=0 then ShowMessage('pegado arriba') else form1.Label3.Caption:='normal';  // el ShowMessage cuelga el form
  55.  
  56.        if Point.Y=0 then form1.Label3.Caption:='pegado arriba' else form1.Label3.Caption:='normal';
  57.        if Point.X=0 then form1.Label4.Caption:='pegado izquierda' else form1.Label4.Caption:='normal';
  58.        if Point.X=screen.Width-1 then form1.Label5.Caption:='pegado derecha' else form1.Label5.Caption:='normal';
  59.        if Point.Y=screen.height-1 then form1.Label6.Caption:='pegado abajo' else form1.Label6.Caption:='normal';
  60.  
  61.   end;
  62.   Result:= CallNextHookEx(hMouseHook, nCode, wParam, lParam);
  63.  
  64. procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
  65. begin
  66.     // Paramos el Hook
  67.   UnhookWindowsHookEx(hMouseHook);
  68.  
  69. procedure TForm1.FormCreate(Sender: TObject);
  70. begin
  71.    form1.Label2.Caption:='El Ancho es:  '+inttostr(Screen.Width)+' El alto es:  '+inttostr(Screen.Height)+' Y el Pixel es:  '+inttostr(Screen.PixelsPerInch);  // Obtener las dimensiones de la pantalla
  72.  
  73.    // Ponemos en marcha el Hook
  74.   hMouseHook:= SetWindowsHookEx(WH_MOUSE_LL, @MouseEvent, HInstance, 0);
  75.  

.

Me funciona muy bien, pero me quedan unas dudas:

 

* Porque cuando utilizo un showmessage se queda como colgado el programita.

* Porque cuando el mouse toca el borde derecho o abajo el valor es el total-1 (es decir si el total es 1500, el mouse marca 1499).

* Como haría para saber cuando tocas las esquinas de la pantalla.

 

Desde ya gracias por su ayuda y me gustaría recibir sus comentarios y correcciones.  :)


  • 0




IP.Board spam blocked by CleanTalk.