PDA

Ver la Versión Completa : Enviar cordenadas del mouse dentro del form a otro form


look
27-12-2013, 21:20:21
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:

...
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:

...
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:

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:

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
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:


if RS.isKey then
PostMessage(ActiveControl.Handle, WM_KEYDOWN, RS.Key,
MakeLong(0, MapVirtualKey(RS.Key, 0)))
else...


lo que quiero es algo asi:


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:


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. :)