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 27-12-2013
Avatar de look
look look is offline
Miembro
 
Registrado: sep 2007
Ubicación: The Shire
Posts: 656
Poder: 17
look Va camino a la fama
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.
__________________
all your base are belong to us
Responder Con Cita
  #2  
Antiguo 28-12-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 28-12-2013
Avatar de look
look look is offline
Miembro
 
Registrado: sep 2007
Ubicación: The Shire
Posts: 656
Poder: 17
look Va camino a la fama
Hola amigo, funciona muy bien.... me quito el sombrero! , muchas gracias.
__________________
all your base are belong to us
Responder Con Cita
  #4  
Antiguo 28-12-2013
Avatar de look
look look is offline
Miembro
 
Registrado: sep 2007
Ubicación: The Shire
Posts: 656
Poder: 17
look Va camino a la fama
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.
__________________
all your base are belong to us
Responder Con Cita
  #5  
Antiguo 28-12-2013
Avatar de look
look look is offline
Miembro
 
Registrado: sep 2007
Ubicación: The Shire
Posts: 656
Poder: 17
look Va camino a la fama
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.
__________________
all your base are belong to us
Responder Con Cita
  #6  
Antiguo 29-12-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 29-12-2013 a las 22:53:46. Razón: identación
Responder Con Cita
  #7  
Antiguo 30-12-2013
Avatar de look
look look is offline
Miembro
 
Registrado: sep 2007
Ubicación: The Shire
Posts: 656
Poder: 17
look Va camino a la fama
Cita:
Empezado por ecfisa Ver Mensaje
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) , 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!
__________________
all your base are belong to us
Responder Con Cita
  #8  
Antiguo 30-12-2013
Avatar de look
look look is offline
Miembro
 
Registrado: sep 2007
Ubicación: The Shire
Posts: 656
Poder: 17
look Va camino a la fama
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.
__________________
all your base are belong to us
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
Form contenedor dentro de otro form. vpepen Varios 7 14-04-2011 00:12:30
Form dentro de otro Malparo Varios 8 12-01-2011 13:49:38
Menu en form dentro de otro kdemia Varios 10 10-08-2010 05:59:54
Un form dentro de otro Ubed Gráficos 7 01-11-2007 20:07:06
¿ Cómo se puede enviar un form a otro dispositivo de imagen o monitor ? dannytec Varios 3 09-04-2006 11:35:32


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


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