急,急,急……!求助于高手:[远程屏幕操作]的实现

bdxie 2004-04-23 09:54:37
远程屏幕操作的实现
在远程截屏的基础上实现屏幕操作
最好有相关源代码

...全文
49 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bdxie 2004-04-28
  • 打赏
  • 举报
回复
UP
bdxie 2004-04-28
  • 打赏
  • 举报
回复
多多支持
谢谢
yinzhiw 2004-04-28
  • 打赏
  • 举报
回复
有兴趣
关注!
bdxie 2004-04-28
  • 打赏
  • 举报
回复
像只是远程屏幕监视的代码
但仍然谢谢您
bdxie 2004-04-28
  • 打赏
  • 举报
回复
急求:远程屏幕控制的相关代码
上顶加分
welllove88 2004-04-25
  • 打赏
  • 举报
回复
控制屏幕的原理其实就是向服务器端发送命令,然后在服务器端对你所做的操作调用相关的API函数,来实现你想要的功能,截取过来的屏幕图片需要做一些定位。
jiangshi99 2004-04-25
  • 打赏
  • 举报
回复
控制屏幕偶有兴趣,学习!
bdxie 2004-04-23
  • 打赏
  • 举报
回复

可E我一份吗
Email:bdxie2000@yahoo.com.cn
非常感谢
上海老李 2004-04-23
  • 打赏
  • 举报
回复
我有VC的,呵呵,无非是把从网络上接收的信息转成控制信息
wasi 2004-04-23
  • 打赏
  • 举报
回复
客户端:
unit clientFrm;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ScktComp, ExtCtrls, ToolWin, ComCtrls, Menus, Buttons, shellapi,
jpeg, ImgList, CSIntf;

type
TfrmClient = class(TForm)
Image: TImage;
ClientSocket: TClientSocket;
ImageList1: TImageList;
ToolBar1: TToolBar;
btnConnect: TToolButton;
btnSnap: TToolButton;
btnDisConnect: TToolButton;
btnClose: TToolButton;
CSObject1: TCSObject;
ToolButton1: TToolButton;
// procedure bu_snapClick(Sender: TObject);
procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btnConnectClick(Sender: TObject);
procedure btnSnapClick(Sender: TObject);
procedure btnDisConnectClick(Sender: TObject);
procedure ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure BtnCloseClick(Sender: TObject);
procedure ToolButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
frmClient: TfrmClient;

implementation


const bufsize = 2048;//接收数据缓冲区的最大值

var
stream: Tmemorystream; //存储接收到jpeg内存流
//jpegscreen: Tjpegimage; //存储jpeg图象
Bitmap:Tbitmap;
{$R *.DFM}

//当窗体创建时,创建Stream,jpegStream对象
procedure TfrmClient.FormCreate(Sender: TObject);
begin
stream := Tmemorystream.Create;
Bitmap := Tbitmap.Create;
end;

//当窗体关闭时,关闭套接字的连接,并释放stream,jpegStream对象
procedure TfrmClient.FormClose(Sender: TObject; var Action: TCloseAction);
begin
clientsocket.Active := false;
stream.Free;
Bitmap.Free;
end;

//连接服务器
procedure TfrmClient.BtnConnectClick(Sender: TObject);
var
remotehost: string;
begin
//输入远程服务器的IP地址
remotehost := inputbox('建立连接', '请输入被察看的机器的IP地址或名称:', 'gari');
if trim(remotehost) <> '' then
begin
if clientsocket.Active then clientsocket.Active := true;
clientsocket.Port := 1234;
clientsocket.Host := remotehost;
//连接
try
clientsocket.Active := true;
except
raise Exception.Create('连接失败!');
end;
end;
end;

//断开连接
procedure TfrmClient.btnDisConnectClick(Sender: TObject);
begin
clientsocket.Active := false;
stream.Clear;
end;

//向服务器端发出'show'指令,要求获取它的屏幕
procedure TfrmClient.btnSnapClick(Sender: TObject);
begin
stream.Clear;
if not ClientSocket.Active then
Raise Exception.Create('请先连接');
clientsocket.Socket.SendText('show');
end;

//关闭窗口
procedure TfrmClient.BtnCloseClick(Sender: TObject);
begin
clientsocket.Active := false;
close;
end;


//客户端接收远程屏幕图象
procedure TfrmClient.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var
buf: array[0..bufsize - 1] of char;
numberbytes: integer;
begin
numberbytes := socket.ReceiveLength;
//接收数据
socket.receiveBuf(buf, numberbytes);
//累加读到stream内存流中
stream.Write(buf, numberbytes);
//当接收到的数据不等于bufSize,代表接收的屏幕图象的最后一个数据,
//否则,代表还没有接收完,继续相服务器端发送'show'指令,继续获取数据
if NumberBytes = bufSize then
Socket.SendText('show')
else
begin
try
//此句代码,非常重要,千万不要忘写,它将内存流指针移到头,
//否则读取内存流时,会从当前位置开始读
Stream.Position := 0;
//将内存流读到JpegScreen图象中
bitmap.LoadFromStream(stream);
//显示在image组件中
image.Picture.Bitmap.Assign(bitmap);
//image.Picture.Bitmap.LoadFromStream(stream);
except
stream.Clear;
end;
end;
end;

procedure TfrmClient.ClientSocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
showmessage('连接成功!');
end;

//当客户端Socket出错时,清空stream数据
procedure TfrmClient.ClientSocketError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
stream.Clear;
end;

procedure TfrmClient.ToolButton1Click(Sender: TObject);
begin
stream.SaveToFile('c:\xx.bmp');
end;

end.

wasi 2004-04-23
  • 打赏
  • 举报
回复
服务器:
unit serverFrm;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, ExtCtrls, StdCtrls, jpeg, registry, shellapi, Buttons;

type
TfrmServer = class(TForm)
ServerSocket: TServerSocket;
Label1: TLabel;
Image1: TImage;
procedure FormCreate(Sender: TObject);
procedure ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure FormDestroy(Sender: TObject);
procedure ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
private
procedure sendscreen;
procedure snapscreen;
public
{ Public declarations }
end;

var
frmServer: TfrmServer;

implementation

const BufSize = 2048; //每次发送的最大数据量

var
LeftSize: Longint; //发送jpeg文件流时,剩下的大小
jpegStream: TMemoryStream; //存储Jpeg文件的内存流
{$R *.DFM}

//当窗体创建时,创建存储屏幕图象的Jpeg文件的内存流
procedure TfrmServer.FormCreate(Sender: TObject);
begin
jpegStream := TmemoryStream.Create;
end;

//释放存储屏幕图象的Jpeg文件的内存流
procedure TfrmServer.FormDestroy(Sender: TObject);
begin
jpegstream.free;
end;

//发送抓取的屏幕图象(Jpeg格式)
procedure TfrmServer.sendScreen;
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
serversocket.Socket.Connections[0].SendBuf(buf, sendsize);
//ShowMessage('开始发送!');
sleep(10);
except
jpegstream.Clear;
end;
if LeftSize = 0 then
jpegStream.Clear;
end;

//抓取本机屏幕,图象转换成Jpeg格式,并存到JpegStream内存流中。
procedure TfrmServer.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);
image1.Picture.Bitmap:=bmpscreen;
image1.Update;
//创建储存Jpeg格式的对象
//jpegscreen := Tjpegimage.Create;
// //将图象压缩成Jpeg格式,保存到JpegStream内存流中。
// jpegscreen.Assign(bmpscreen);
// jpegscreen.CompressionQuality := 40;
// jpegscreen.SaveToStream(jpegStream);
//
//
bmpscreen.SaveToStream(jpegStream);
jpegstream.Position := 0;
LeftSize := jpegStream.Size;
//释放创建的对象
FullscreenCanvas.Free;
bmpscreen.Free;
//jpegscreen.Free;
ReleaseDC(0, DC);
end;

//接收客户端的发送的指令
procedure TfrmServer.ServerSocketClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
rstr: string;
begin
rstr := socket.ReceiveText;
//如果收到的指令是'show',代表开始抓取,并回传客户端
if rstr = 'show' then
sendscreen();
end;

//当客户端断开连接时,清空jpegStream内存流
procedure TfrmServer.ServerSocketClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
jpegStream.Clear;
jpegStream.Position := 0;
end;

//当客户端Socket发生错误时,清空jpegStream内存流
procedure TfrmServer.ServerSocketClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
jpegStream.Clear;
jpegStream.Position := 0;
end;

end.

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧