关于远程控制分辨率的问题,非高手别进?(200分)

  • 主题发起人 主题发起人 zhengxq
  • 开始时间 开始时间
Z

zhengxq

Unregistered / Unconfirmed
GUEST, unregistred user!
服务端:
使用抓屏程序进行抓屏然后传送到客户端,并显示在客户端窗体的Image上,然后用鼠标在客户端的Image上进行操作,再将鼠标操作和位置作为参数传回服务端。代码省略。

客户端:
使用如下代码,将客户端传来的鼠标操作和位置参量进行模拟客户端的远程控制操作。
procedure TForm1.Image1DblClick(Sender: TObject);
begin
clientsocket1.Socket.SendText(inttostr(cx)+'ssdouble'+inttostr(cy));
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
cx:=x;
cy:=y;
if shift=[ssleft] then
begin
clientsocket1.Socket.SendText(inttostr(x)+'ssleft'+inttostr(y));
end;
if shift=[ssright] then
begin
clientsocket1.Socket.SendText(inttostr(x)+'ssright'+inttostr(y));
end;
end;
cx,cy是两个自定义变量.

服务器端:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
s:string;
s2:pchar;
sx,sy:integer
begin
s:=socket.ReceiveText;
s2:=pchar(s);
if strpos(s2,'ssdouble')<>nil then
begin
sx:=strtoint(copy(s,1,strpos(s2,'ssdouble')-s2));
sy:=strtoint(copy(s,(strpos(s2,'ssdouble')-s2)+9,length(s)-(strpos(s2,'ssdouble')-s2)-8));
setcursorpos(sx,sy);
mouse_event(MOUSEEVENTF_LEFTDOWN, sx, sy, 0, 0 );
mouse_event(MOUSEEVENTF_LEFTUP, sx, sy, 0, 0 );
mouse_event(MOUSEEVENTF_LEFTDOWN, sx, sy, 0, 0 );
mouse_event(MOUSEEVENTF_LEFTUP, sx, sy, 0, 0 );
end;
if strpos(s2,'ssleft')<>nil then
begin
sx:=strtoint(copy(s,1,strpos(s2,'ssleft')-s2));
sy:=strtoint(copy(s,(strpos(s2,'ssleft')-s2)+7,length(s)-(strpos(s2,'ssdouble')-s2)-6));
setcursorpos(sx,sy);
mouse_event(MOUSEEVENTF_LEFTDOWN, sx, sy, 0, 0 );
mouse_event(MOUSEEVENTF_LEFTUP, sx, sy, 0, 0 );
end;
if strpos(s2,'ssright')<>nil then
begin
sx:=strtoint(copy(s,1,strpos(s2,'ssright')-s2));
sy:=strtoint(copy(s,(strpos(s2,'ssright')-s2)+8,length(s)-(strpos(s2,'ssright')-s2)-7));
setcursorpos(sx,sy);
mouse_event(MOUSEEVENTF_RIGHTDOWN, sx, sy, 0, 0 );
mouse_event(MOUSEEVENTF_RIGHTUP, sx, sy, 0, 0 );
end;
end;

现在的问题是,在服务端的模拟鼠标操作中,可能是由于分辨率的问题,导致鼠标的位置不对(错位),如17寸和15寸显示器/800*600和1024*768,请问有什么办法解决这个问题?
 
这个应该没什么问题,你只要保证客户端窗体的Image的大小和服务器端分辨率一样
不就解决问题了吗?传给服务器端的鼠标坐标就是你客户端窗体的鼠标相对Image的
坐标(以Image的 左上角为 0,0)。
 
使用相对的坐标呀,
根据比例来计算~~~~~~~~~~
在服务器端处理就传递Image1的长度和宽度
在客户端处理就传递服务器的分辨率~~~
呵呵~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
200不是那么容易得的,最少也写点代码让我看看吧!
 
分我多的是,这么说你还不明白我也懒得再说了。
你怎么不问别人要全部的代码?不自己动手,老是Copy Paste别人的东西
是学不到东西的。
 
不会吧,
我说得够清楚了吧,
不用再解释一遍吧,老兄
200分就能让我给代码,真的太小看我了,我不稀罕200块更别说200分,
当DFW不一定很光荣的,

不过,我最喜欢讨论之类的,很有意思。
如果你还没有懂呢,就直说,代码就不给了,
呵呵~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
不是叫你们把全部代码写出来,只是将几个关键函数给出,如果我这么快明白的话,我就不问这个问题啦,我是第一次接触这种问题,当然很多都不懂,但也只是关键的几个问题没弄懂,我喜欢看代码是因为有很多问题刚接触时一点概念都没有,就算知道某种方法可以,但可能不知道究竟有没有相关的函数可以实现,所以至少给出必须的函数,而具体的算法倒不紧要,我怎么都能搞定吧。
 
简单:
Image1.Width := GetSystemMetrics(SM_CXSCREEN));
Image1,Height := GetSystemMetrics(SM_CYSCREEN));
Image.Align := False;
OK!
 
接受答案了.
 
后退
顶部