Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Enviar cordenadas del mouse dentro del form a otro form (https://www.clubdelphi.com/foros/showthread.php?t=84921)

look 27-12-2013 21:20:21

Enviar cordenadas del mouse dentro del form a otro form
 
Hola amigos, tengo dos Aplicaciones que comunican por socket, ambas aplicaciones tienen la misma dimension del form principal.
lo que quiero hacer es que al dar click en un area del form cliente, este mande esas cordenadas del formulario a la aplicacion server y en el servidor con estas cordenadas simular en evento click en esas cordenadas, en el cliente obtengo las cordenadas asi con Self.ScreenToClient(Point(0,0)).

lo que necesito es simular un click en la otra aplicacion mandando las cordenadas de donde el usuario dio click en la aplicacion cliente, para que de este modo en el servidor se simule el click algo asi como remoto. , lo que necesitaria es algo asi como un frmMain.setCursorPost.

ecfisa 28-12-2013 14:05:42

Hola look :)

Fijate si te sirve de este modo.

Cliente:
Código Delphi [-]
...
procedure TfrmClient.FormClick(Sender: TObject);
var
  P: TPoint;
begin
  P := ScreenToClient(Mouse.CursorPos);
  if ClientSocket1.Active then
    ClientSocket1.Socket.SendBuf(P, SizeOf(P));
end;

Servidor:
Código Delphi [-]
...
procedure TfrmServer.ServerSocket1ClientRead(Sender: TObject;  Socket: TCustomWinSocket);
var
  i:integer;
  P: TPoint;
  si: array[0..1] of TInput;
begin
  with ServerSocket1.Socket do
  begin
    for i := 0 to ActiveConnections-1 do
    begin
      Connections[i].ReceiveBuf(P, SizeOf(P));
      P := ClientToScreen(P);
      SetCursorPos(P.X, P.Y);
      ZeroMemory(@si, sizeof(si));
      si[0].Itype := INPUT_MOUSE;
      si[0].mi.dwFlags := MOUSEEVENTF_LEFTDOWN;
      si[1].Itype := INPUT_MOUSE;
      si[1].mi.dwFlags := MOUSEEVENTF_LEFTUP;
      SendInput(2, si[0], SizeOf(TInput));
    end;
  end;
end;


// Ejemplo de la captura
procedure TfrmServer.FormClick(Sender: TObject);
var
  P: TPoint;
begin
  P := ScreenToClient(Mouse.CursorPos);
  Caption := Format('Click en: %d %d',[P.X, P.Y]);
end;

Saludos :)

look 28-12-2013 16:30:06

Hola amigo, funciona muy bien.... me quito el sombrero! , muchas gracias. :)

look 28-12-2013 16:33:06

Hola, como podria modificarlo para enviar una pulsacion de una tecla, asumiendo que con el evento del mouse el cursor se posiciona en un edit al lado del servidor, ahora el siguiente paso seria enviar una pulsacion de una tecla para simular la escritura en el teclado. :rolleyes:

look 28-12-2013 17:23:47

Hola, hasta ahora la idea que manejo es enviar desde el cliente el key del evento onKeyDown y al recivirlo en el servirdor convertir el codigo del key en una pulsacion.

ecfisa 29-12-2013 01:42:45

Hola look.

Siendo sincero no sé si entendí correctamente lo que buscas hacer, pero a ver si es algo así...

Cliente:
Código Delphi [-]
implementation

type
  TRecSign = record
    case IsKey : Boolean of
      False: (Point: TPoint);
      True : (Key : Word);
  end;

var
 RS: TRecSign;

procedure TfrmClient.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  RS.Point := ClientToScreen(Point(X,Y));
end;

procedure TfrmClient.FormClick(Sender: TObject);
begin
  RS.IsKey := False;
  RS.Point := ScreenToClient(Mouse.CursorPos);
  if ClientSocket1.Active then
    ClientSocket1.Socket.SendBuf(RS, SizeOf(RS));
end;

procedure TfrmClient.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  RS.IsKey := True;
  RS.Key   := Key;
  if ClientSocket1.Active then
    ClientSocket1.Socket.SendBuf(RS, SizeOf(RS));
end;

Servidor:
Código Delphi [-]
implementation

type
  TRecSign = record
    case IsKey : Boolean of
      False: (Point: TPoint);
      True : (Key : Word);
  end;

var
 RS: TRecSign;

procedure TfrmServer.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  i:integer;
  si: array[0..1] of TInput;
begin
  with ServerSocket1.Socket do
  begin
    for i := 0 to ActiveConnections-1 do
    begin
      Connections[i].ReceiveBuf(RS, SizeOf(RS));
      if RS.isKey then
        PostMessage(ActiveControl.Handle, WM_KEYDOWN, RS.Key,
          MakeLong(0, MapVirtualKey(RS.Key, 0)))
      else
      begin
        ZeroMemory(@si, sizeof(si));
        si[0].Itype := INPUT_MOUSE;
        si[0].mi.dwFlags := MOUSEEVENTF_LEFTDOWN;
        si[1].Itype := INPUT_MOUSE;
        si[1].mi.dwFlags := MOUSEEVENTF_LEFTUP;
        RS.Point := ClientToScreen(RS.Point);
        SetCursorPos(RS.Point.X, RS.Point.Y);
        SendInput(2, si[0], SizeOf(TInput))
      end
    end;
  end;
end;

procedure TfrmServer.FormClick(Sender: TObject);
var
  P: TPoint;
begin
  P := ScreenToClient(Mouse.CursorPos);
  Caption := Format('Click en: %d %d',[P.X, P.Y]);
end;

Saludos :)

look 30-12-2013 16:24:01

Cita:

Empezado por ecfisa (Mensaje 471123)
Hola look.
Siendo sincero no sé si entendí correctamente lo que buscas hacer, pero a ver si es algo así...

Hola amigo, el codigo funciona bien, la aplicacion recibe la tecla pero hay un pequeño detalle:

Código Delphi [-]
      if RS.isKey then
        PostMessage(ActiveControl.Handle, WM_KEYDOWN, RS.Key,
          MakeLong(0, MapVirtualKey(RS.Key, 0)))
      else...

lo que quiero es algo asi:

Código Delphi [-]
      if RS.isKey then
        PostMessage( FindWindow(nil, PChar('Notepad'))  , WM_KEYDOWN, RS.Key,
          MakeLong(0, MapVirtualKey(RS.Key, 0)))
      else
Pero este no me funciona...

Te explicare que es lo que trato de hacer, la aplicacion server tiene como objetivo embeber una aplicacion en un panel, digamos... notepad, entonces desde el cliente mandas las cordenadas del mouse para que el servidor lo interpre ("Esto funciona muy bien") , ahora lo que hace falta es enviar las teclas que el usuario precione desde el cliente, esto funciona bien , solo que las envia a la aplicacion server en si, pero realmente se las quiero mandar a la aplicacion embebida ("Confuso no?2) :D , en fin es por eso que necesito encontrar el handle de la ventana para hacer el postMessage pero no me esta funcionando...

Saludos!, gracias por la ayuda!

look 30-12-2013 16:58:22

Hola , con esto ya quedo:

Código Delphi [-]
      if RS.isKey then
      begin
          keybd_event(VK_SHIFT, 0, 0, 0);
          keybd_event(RS.Key , 0, 0, 0);
          keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
      end

Gracias por la ayuda, cuando termine la aplicacion la subire al foro para compartirla. :)


La franja horaria es GMT +2. Ahora son las 18:12:12.

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