不知道如下代码有什么问题
接收不到远程桌面服务端///////////////////////////////////////
procedure TForm1.Button2Click(Sender: TObject);
var
sendsize:longint;
Buf:array[0..BufSize-1] of char;
begin
if JpegStream.Size = 0 then
snapscreen;
if LeftSize > BufSize then
SendSize := BufSize
else
SendSize := LeftSize;
//将jpegStream内存流读取SendSize大小的数据到缓冲区
jpegStream.ReadBuffer(Buf,sendSize);
LeftSize:=LeftSize-SendSize;
//向客户端发送
try
idudpclient1.SendBuffer(buf,sendsize);
Memo1.Lines.Add(Buf);//测试,这里有数据传输
sleep(10);
except
jpegstream.Clear;
end;
if LeftSize=0 then
jpegStream.Clear;
end;procedure Tform1.snapScreen();
var
bmpscreen:Tbitmap;
jpegscreen:Tjpegimage;
FullscreenCanvas:TCanvas;
dc:HDC;
sourceRect,destRect:TRect;
begin
//得到屏幕设备
dc:=getdc(0);
//创建画布句柄
fullscreencanvas:=Tcanvas.Create;
fullscreencanvas.Handle:=dc;
//创建存储位图对象
bmpscreen:=Tbitmap.create;
bmpscreen.Width:=screen.Width;
bmpscreen.Height:=screen.Height;
sourcerect:=rect(0,0,screen.Width,screen.Height);
destrect:=rect(0,0,screen.Width,screen.Height);
//将屏幕图象抓取到bmpScreen位图中
bmpscreen.Canvas.CopyRect(sourcerect,fullscreenCanvas,destrect);
//创建储存Jpeg格式的对象
jpegscreen:=Tjpegimage.Create;
//将图象压缩成Jpeg格式,保存到JpegStream内存流中。
jpegscreen.Assign(bmpscreen);
jpegscreen.CompressionQuality:=10;
jpegscreen.SaveToStream(jpegStream);
jpegstream.Position:=0;
LeftSize:=jpegStream.Size;
//释放创建的对象
FullscreenCanvas.Free;
bmpscreen.Free;
jpegscreen.Free;
ReleaseDC(0,DC);
end; //以上是发送的代码,下面是接收的代码,但是总是接收不到procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
datastringstream:TStringStream;
begin
datastringstream:=TStringStream.Create('');
datastringstream.CopyFrom(AData,AData.Size);
Image1.Picture.Bitmap.LoadFromStream(datastringstream);
Image1.Free;
end;这里并不能获得远程桌面的截图,请问如何能获取到呢?谢谢各位了。来者有分
别告诉我用TCP,我现在只想知道UDP的,谢谢各位了
接收不到远程桌面服务端///////////////////////////////////////
procedure TForm1.Button2Click(Sender: TObject);
var
sendsize:longint;
Buf:array[0..BufSize-1] of char;
begin
if JpegStream.Size = 0 then
snapscreen;
if LeftSize > BufSize then
SendSize := BufSize
else
SendSize := LeftSize;
//将jpegStream内存流读取SendSize大小的数据到缓冲区
jpegStream.ReadBuffer(Buf,sendSize);
LeftSize:=LeftSize-SendSize;
//向客户端发送
try
idudpclient1.SendBuffer(buf,sendsize);
Memo1.Lines.Add(Buf);//测试,这里有数据传输
sleep(10);
except
jpegstream.Clear;
end;
if LeftSize=0 then
jpegStream.Clear;
end;procedure Tform1.snapScreen();
var
bmpscreen:Tbitmap;
jpegscreen:Tjpegimage;
FullscreenCanvas:TCanvas;
dc:HDC;
sourceRect,destRect:TRect;
begin
//得到屏幕设备
dc:=getdc(0);
//创建画布句柄
fullscreencanvas:=Tcanvas.Create;
fullscreencanvas.Handle:=dc;
//创建存储位图对象
bmpscreen:=Tbitmap.create;
bmpscreen.Width:=screen.Width;
bmpscreen.Height:=screen.Height;
sourcerect:=rect(0,0,screen.Width,screen.Height);
destrect:=rect(0,0,screen.Width,screen.Height);
//将屏幕图象抓取到bmpScreen位图中
bmpscreen.Canvas.CopyRect(sourcerect,fullscreenCanvas,destrect);
//创建储存Jpeg格式的对象
jpegscreen:=Tjpegimage.Create;
//将图象压缩成Jpeg格式,保存到JpegStream内存流中。
jpegscreen.Assign(bmpscreen);
jpegscreen.CompressionQuality:=10;
jpegscreen.SaveToStream(jpegStream);
jpegstream.Position:=0;
LeftSize:=jpegStream.Size;
//释放创建的对象
FullscreenCanvas.Free;
bmpscreen.Free;
jpegscreen.Free;
ReleaseDC(0,DC);
end; //以上是发送的代码,下面是接收的代码,但是总是接收不到procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
datastringstream:TStringStream;
begin
datastringstream:=TStringStream.Create('');
datastringstream.CopyFrom(AData,AData.Size);
Image1.Picture.Bitmap.LoadFromStream(datastringstream);
Image1.Free;
end;这里并不能获得远程桌面的截图,请问如何能获取到呢?谢谢各位了。来者有分
别告诉我用TCP,我现在只想知道UDP的,谢谢各位了
解决方案 »
- 用ado连接往二进制的字段里写入文件,采用msde,文件如果几兆,存的时候还比较快,稍微大点,比如10几兆,保存的时候非常慢!
- 用delphi 写个隐藏其它程序的工具
- 如何比较两个IP地址是否相等?
- 用ADO连接paradox数据库的问题?
- 失业中
- 可有哪位大侠知道在delphi中如何取得在sql语句中由compute产生的字段信息?
- 医院的挂号统计问题,急需帮助,分数可加!!!
- 还有三千多分可以散掉。。。大家新年好,来拿分吧。。。第二次
- 20分问个问题,我以前的csdn帐号的密码忘了,怎么办,怎样可拿回密码?//(l_jia)
- 不知有没有哪位大虾知道,聊天室里给自己加管理员帽子是怎么一回事?
- 局域网访问
- 关于时间函数的问题!!
//前面要datastringstream.Position:=0;或者直接用:Image1.Picture.Bitmap.LoadFromStream(ADate);2、发送的时候,你数据块大会分包来发送,但是接收的地方,直接接收了就放到Image1上了,你确认接收完成了么?
每次接收可能是一包,也可能是很多包才能接收完,你要判断数据包的结尾,然后再显示。
我这么写也接收不到
const buffersize=2048;//同发送端的buffersize一样procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
datastringstream:TStringStream;
begin
datastringstream:=TStringStream.Create('');
datastringstream.CopyFrom(AData,AData.Size);
if AData.Size< BufSize then //数据已读完
datastringstream.Position:=0;
Image1.Picture.Bitmap.LoadFromStream(datastringstream);
Memo1.Lines.Add(string(datastringstream));
Image1.Free;
end;这么写还是接收不到,请问哪出现问题了呢?
如果不能触发,那要看你的通讯设置对不对。var
datastringstream:TStringStream;
begin
datastringstream:=TStringStream.Create('');
datastringstream.CopyFrom(AData,AData.Size);
if AData.Size < BufSize then //数据已读完
datastringstream.Position:=0;
Image1.Picture.Bitmap.LoadFromStream(datastringstream); //XXXXXXXXXXXXXXXXXXXXX
Memo1.Lines.Add(string(datastringstream));
Image1.Free; 严重不对。逻辑混乱,每次都重新建立一个TStringStream,每次都把数据写在头上,即使接收了,也不会正常显示在Image1上,
而且下边的判断成立之后,才能执行所有的下边的代码。AData.Size是每次的数据包<BufSize基本可以判断是数据读完,唯一例外
是数据刚好是BufSize的整数倍的时候。
datastringstream.Position:=0;
datastringstream.DataString///////////是什么内容,对不对。
ABinding: TIdSocketHandle);
var
datastringstream:TStringStream;
begin
datastringstream:=TStringStream.Create('');
datastringstream.CopyFrom(AData,AData.Size);
datastringstream.position:=0;
Image1.Picture.Bitmap.LoadFromStream(datastringstream);
Image1.Free;
end; 经过测试,发送端发送与接收端接收的数据是一样的,但是还是无法获取远程桌面图片
请问该如何获取?
datastringstream:TStringStream;
....
datastringstream:=TStringStream.Create(''); .......procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
begin
datastringstream.CopyFrom(AData,AData.Size);
if AData.Size < BufSize then //数据已读完
begin
datastringstream.Position:=0;
Image1.Picture.Bitmap.LoadFromStream(datastringstream);
end;
....这样的逻辑差不多。--不要等别人给你写完整的代码吧,清楚了逻辑和自己出的问题就可以了,自己去调试。
测试如果加了
if AData.Size < BufSize then //数据已读完
Image1.Picture.Bitmap.LoadFromStream(datastringstream);
这句不会被执行
我不明白了。
没出入么?你的代码每次都重新建立一个datastringstream,不会保留前面的数据。-----------------------------
Image1.Picture.Bitmap.LoadFromStream(datastringstream);
//这句只要最后执行一次就可以了,不是每次都执行。
datastringstream:tstringstream;procedure TForm1.FormCreate(Sender: TObject);
begin
datastringstream:=TstringStream.Create;
end;procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
begin
datastringstream.CopyFrom(AData,AData.Size);
if AData.Size < BufSize then //数据已读完
begin
datastringstream.Position:=0;
Image1.Picture.Bitmap.LoadFromStream(datastringstream);
end; 这么写应该没问题了吧。
可是还是读不出来,不知道为什么
难道是发送端有问题?
测试到IdUDPServer1UDPRead被触发了,但是
Image1.Picture.Bitmap.LoadFromStream(datastringstream);
好象没什么动作
最后DataStringStream.Size和发送的时候JpegStream.Size长度一致么?
你的程序是反复点击Button2才行,一次只能发送BufSize大小,若比较大,需要你点击多次按钮才行,你这样做了么?
你的JpegStream里的数据是个Jpeg图片,这边Image1.Picture.BitMap.LoadFromStream是不行的,Image不能直接读Jpg文件
var
jpg:TJPEGImage;
begin
jpg:=TJPEGImage.Create;
jpg.LoadFromStream(datastringstream);
Image1.Picture.Bitmap.Assign(jpg);............
我用time多次点击。
你的代码可以显示图片了
但是只能显示一半
var
datastringstream:tstringstream;
jpg:TJPEGImage;
procedure TForm1.FormCreate(Sender: TObject);
begin
datastringstream:=TstringStream.Create;
jpg:=TJPEGImage.Create;
end; procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
begin
datastringstream.CopyFrom(AData,AData.Size);
if AData.Size < BufSize then //数据已读完
begin
datastringstream.Position:=0;
jpg.LoadFromStream(datastringstream);
Image1.Picture.Bitmap.Assign(jpg);
end; 这里不加if AData.Size < BufSize then //数据已读完 可以显示一半
但是加了就完全不显示了
UDPSERVER只触发了一次
----------头大
原来我把datastringstream.free了
非常感谢gzmhero的支持
结贴,给分