远程抓取屏幕 ( 积分: 100 )

  • 主题发起人 主题发起人 sunsiz
  • 开始时间 开始时间
S

sunsiz

Unregistered / Unconfirmed
GUEST, unregistred user!
我做的程序,可以抓取屏幕发送给接手端。不过在接手端接受不了图像信息,存到文件看,是一片空白的文件。请大家帮忙!!!

发送端代码:

procedure TForm1.FormCreate(Sender: TObject);
begin
m1:=TMemoryStream.create;
TcpServer1.LocalPort:='1111';
TcpServer1.Active:=true;
TcpClient1.RemoteHost:='192.168.1.2';
TcpClient1.RemotePort:='2222';
TcpClient1.Active:=true;
end;

procedure TForm1.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
var
s1:string;
desk:tcanvas;
bitmap:tbitmap;
jpg:tjpegimage;
begin
if ClientSocket.Receiveln()='start' then
begin
bitmap:=tbitmap.Create;
jpg:=tjpegimage.Create;
desk:=tcanvas.Create;
desk.Handle:=getdc(hwnd_desktop);
m1:=tmemorystream.Create;
with bitmap do
begin
width:=screen.Width;
height:=screen.Height;
PixelFormat :=pf16bit;
canvas.CopyRect(canvas.cliprect,desk,desk.cliprect);
end;
jpg.CompressionQuality :=5;
jpg.Assign(bitmap);
jpg.SaveToStream(m1);
// jpg.free;
bitmap.Free;
m1.Position:=0;
s1:=inttostr(m1.size);
try
if TcpClient1.Connect then
begin
TCPClient1.sendln(s1);
end;
finally
TcpClient1.Disconnect;
end;
end
else
begin
m1.Position:=0;
try
if TcpClient1.Connect then
begin
m1.SaveToFile('C:/temp.jpg');
TCPClient1.SendStream(M1);
end;
finally
TcpClient1.Disconnect;
end;
end;
end;
*****************************************************************
m1.SaveToFile('C:/temp.jpg');在存到的文件是正常的。

接受端代码:

procedure TForm1.FormCreate(Sender: TObject);
begin
memoryStream:=TMemoryStream.create;
TcpServer1.LocalPort:='2222';
TcpServer1.Active:=true;
TcpClient1.RemoteHost:='192.168.1.2';
TcpClient1.RemotePort:='1111';
TcpClient1.Active:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
try
TcpClient1.RemoteHost:='192.168.1.2';
TcpClient1.RemotePort:='1111';
//TcpClient1.Active:=true;
if TcpClient1.Connect then
begin
TcpClient1.Sendln('start');
end;
finally
TcpClient1.Disconnect;
end;
end;

procedure TForm1.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
var
buffer:array [0..100000] of byte; //设置接收缓冲区
ll:string;
b:tbitmap;
j:tjpegimage;
begin
if c=0 then //C为服务端发送的字节数,如果为0表示为尚未开始图象接收
begin
ll:=ClientSocket.Receiveln;
c:=strtoint(ll); //设置需接收的字节数
try
TcpClient1.RemoteHost:='192.168.1.2';
TcpClient1.RemotePort:='1111';
//TcpClient1.Active:=true;
if TcpClient1.Connect then
begin
TcpClient1.Sendln('okok'); //通知服务端开始发送图象
end;
finally
TcpClient1.Disconnect;
end;
end else
begin //以下为图象数据接收部分
ClientSocket.ReceiveBuf(buffer,c); //接收数据包并读入缓冲区内
memorystream.Write(buffer,c); //追加入流M中
// showmessage(inttostr(memorystream.Size));
if memorystream.Size>=c then //如果流长度大于需接收的字节数,则接收完毕
begin
memorystream.Position:=0;
b:=tbitmap.Create;
j:=tjpegimage.Create;
try
memorystream.SaveToFile('C:/tmp.jpg');
j.LoadFromStream(memorystream); //将流M中的数据读至JPG图像对象J中
b.Assign(j); //将JPG转为BMP
Image1.Picture.Bitmap.Assign(b); //分配给image1元件
finally //以下为清除工作
b.free;
j.free;
memorystream.Clear;
c:=0;
end;
end;
// end;
end;
end;
************************************************************

memorystream.SaveToFile('C:/tmp.jpg');接受不了图像。
请各位帮个忙!!!
 
服务端在没有登录的时候是取不到屏幕的
SaveToFile以后在Position := 0;
你跟一下看看SaveToFile以后的Position是多少
 
SaveToFile以后 Position = 0 的。
执行到 j.LoadFromStream(memorystream); 时,出错“JPEG Error 53#”。
还是一样。帮帮忙!
 
服务端在没有登录的时候是取不到屏幕的
这是什么意思?你说接收端要登陆那台计算机吗?
 
难道没人能帮忙吗?
 
N多木马的代码有现成的代码,可以自己google或者盒子就有.
 
你要做木马呀?
------------------------------------------------------
http://www.waibaoinfo.com 外包信息网
 
缓冲区设小点
buffer:array [0..4196] of byte; //设置接收缓冲区
 
网络接受的时候出现丢包或数据出错时,接收的文件也可能出错,建议加个数据校验的过程,并对出错的包进行重发
 
发送端在发送文件的时候文件发送也太大了,可以分割数据流,到接受端在重组!!

只有理论知识,实际代码上帮不上忙[:D]
 
TBitMap 和 TImage 经常会会出问题
很正常拉
如果你频繁的截取的话,肯定会有这个问题的
到时候保存下来的bmp文件都是白的
 
to sbzldlb:
问题是指截取的时候?还是转化成文件流的时候?还是发送数据的时候呢?
 
"你要做木马呀?" 不是。
----------------------------------
"缓冲区设小点" 图像大小是30~40KB缓冲区小的话更是接受不了。
----------------------------------
问题出在接受文件时,图像大小是30~40KB 应该不用拆分也可以接受吧?
---------------------------------
我找了一些实例,但不是Delphi7做的而且用了一些在Delphi7没有的组建,就是用不上。
如果大家知道推荐以下几个源码!谢谢大家回复。
 
有个UDP的DEMO,EMail留个,发给你
 
109429987@qq.com
谢谢!
 
這樣的到盒子上下些例子吧,不用再討論了。
 
用IdTcpClient和IDTcpServer控件终于搞定了。它能够直接接受Stream而且用WriteInteger和WriteStream可以跟着写下去,ReadInteger和ReadStream自己能分开接受很方便。
谢谢大家的关注和帮忙。
 
后退
顶部