全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1355
推到 Plurk!
推到 Facebook!

基於阻塞Socket(Indy)的遠程控制類庫-TNetCommand世界中的禮儀-02

 
ququd
一般會員


發表:2
回覆:3
積分:1
註冊:2004-08-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-24 02:03:10 IP:202.99.xxx.xxx 未訂閱
TNetCommand世界中的禮儀 TNetImage類 源代碼 // uNetImge .pas 螢幕圖像相關操作 {{ 作者:蛐蛐 時間:2004.5.26 } unit uNetImage; interface uses Classes, Windows, Graphics, Forms, Jpeg, SysUtils, IdTCPServer, IdTCPClient,uNetCommand; type TNetImage = class (TNetCommand) public Compress: Integer; ImageStream: TMemoryStream; ImageTime: string; JpegImage: TJpegImage; RemoteImageStream: TMemoryStream; RemoteJpegImage: TJpegImage; constructor Create; destructor Destroy; override; function ReadData(Client: TIdTCPClient): Boolean; override; function ReadImage(Client: TIdTCPClient): Boolean; // : 截取螢幕到Bitmap {{ function SnapScreen. BmpScreen 返回值. Returns: 調用成功為true,否則為false. } function SnapScreen(var BmpScreen: TBitmap): Boolean; overload; // : 截取螢幕到JPEG {{ function SnapScreen. JpegScreen 返回值 , JpegCompress 圖像壓縮比. Returns: 調用成功為true,否則為false. } function SnapScreen(var JpegScreen: TJpegImage; JpegCompress: integer=100): Boolean; overload; // : 截取螢幕到Stream {{ function SnapScreenToStream. Stream 返回值, JpegCompress 圖像壓縮比. Returns: 調用成功為true,否則為false. } function SnapScreenToStream(var Stream: TMemoryStream; JpegCompress: integer=100): Boolean; function WriteData(Server: TIdTCPServerConnection): Boolean; override; function WriteImage(Server: TIdTCPServerConnection): Boolean; end; const CM_GETSCREEN=101; implementation { ********************************** TNetImage *********************************** } constructor TNetImage.Create; begin inherited Create; ImageStream:=TMemoryStream.Create; JpegImage:=TJpegImage.Create; RemoteJpegImage:=TJpegImage.Create; RemoteImageStream:=TMemoryStream.Create; end; destructor TNetImage.Destroy; begin ImageStream.Free; JpegImage.Free; RemoteJpegImage.Free; RemoteImageStream.Free; inherited Destroy; end; function TNetImage.ReadData(Client: TIdTCPClient): Boolean; begin result:=true; // Client.WriteInteger(TCP_NETIMAGE); // Client: 1. 通知主人,是我來拜訪 RemoteCommandTime:=Client.ReadLn(); Client.WriteInteger(CommandType); // Client 2. 看看老兄的螢幕 case CommandType of // // Client: 3. 收到了,把它裝到RemoteJpegImage CM_GETSCREEN: Result:=ReadImage(Client); { 預留操作項 1: ; 2: ; 3: ; } end; // case end; function TNetImage.ReadImage(Client: TIdTCPClient): Boolean; var Size: Integer; begin result:=true; try with Client do begin WriteInteger(Compress); // 2 compress Size:=ReadInteger(); // 3 StreamSize ReadStream(RemoteImageStream,Size); RemoteImageStream.Position:=0; RemoteJpegImage.LoadFromStream(RemoteImageStream); end; except result:=false; end; end; function TNetImage.SnapScreen(var BmpScreen: TBitmap): Boolean; var FullScreenCanvas: TCanvas; dc: HDC; SourceRect, DestRect: TRect; begin result := true; try dc := GetDC(0); FullScreencanvas := Tcanvas.Create; FullScreencanvas.Handle := dc; 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.Canvas.CopyRect(SourceRect, FullScreenCanvas, DestRect); except result := false; end; end; function TNetImage.SnapScreen(var JpegScreen: TJpegImage; JpegCompress: integer=100): Boolean; begin {… } end; function TNetImage.SnapScreenToStream(var Stream: TMemoryStream; JpegCompress: integer=100): Boolean; begin {… } end; function TNetImage.WriteData(Server: TIdTCPServerConnection): Boolean; begin result:=true; Server.WriteLn(TimeToStr(GetTime)); // Send Time case Server.ReadInteger of // Get Commandtype // Server: 2. 小事一樁,把螢幕傳給你,準備接受 CM_GETSCREEN: Result:=WriteImage(Server) ; 1: ; 2: ; 3: ; end; // case end; function TNetImage.WriteImage(Server: TIdTCPServerConnection): Boolean; var Stream: TMemoryStream; begin Stream:= TMemorySTream.Create; Compress:=Server.ReadInteger(); // 1 compress if SnapScreenToStream(Stream,Compress) then begin with Server do begin WriteInteger(Stream.Size); WriteStream(Stream); end; result:=true; end else result:= false; Stream.Free; end; end. Server端核心程式 procedure TFrmServer.cpsServerExecute(AThread: TIdPeerThread); var intCommand: Integer; netCommand: TNetCommand; begin With AThread.Connection do begin intCommand:=ReadInteger(); // Server: 1. 究竟是誰來拜訪 case intCommand of TCP_NETIMAGE: // 1.1原來是TNetImage, netCommand:=TNetImage.Create; // “主隨客便”乾脆換上TNetImage的行頭 TCP_NETSYSTEMINFO: netCommand:=TNetSystemInfo.Create; TCP_NETPROCESS: netCommand:=TNetProcess.Create; TCP_NETFILE: netCommand:=TNetFile.Create; { //if you have new class ,you can do like this TCP_NETEXITWINDOWS: netCommand:=TNetExitWindows.Create; TCP_NETMOUSE: netCommand:=TNetMouse.Create; } TCP_QUIT: Disconnect; else exit; end; end; // Server : 1.2總要招待一下客人,問問需要些什麼 netCommand.WriteData(AThread.Connection); end; Client端請求得到對方螢幕 procedure TFrmClient.aNetImageGetScreenExecute(Sender: TObject); var netImage: TNetImage; begin netImage:=TNetImage.Create; netImage.CommandType:=CM_GETSCREEN; // 事件 Client: 想看看老兄的螢幕 netImage.Compress:=netImageCompress; if not netImage.ReadData(cpcClient) then begin ShowMessage('截取螢幕失敗!'); end else begin imgScreen.Picture.Assign(netImage.RemoteJpegImage); sbInfo.Panels[0].Text:='截取螢幕成功'; end; netImage.Free; end; TNetCommand世界中的禮儀 事件 Client: 想看看老兄的螢幕 netImage.CommandType:=CM_GETSCREEN; netImage.ReadData(cpcClient) Client: 1. 通知主人,是我來拜訪Client.WriteInteger(TCP_NETIMAGE); Server: 1. 究竟是誰來拜訪? intCommand:=ReadInteger(); 1.1原來是TNetImage,“主隨客便”乾脆換上TNetImage的行頭 netCommand:=TNetImage.Create; 1.2總要招待一下客人,問問需要些什麼 netCommand.WriteData(AThread.Connection); 1.3噓寒問暖,一筆帶過吧 Server.WriteLn(TimeToStr(GetTime));… Client: 2. 看看老兄的螢幕 Client.WriteInteger(CommandType); // CommandType:=CM_GETSCREEN Server: 2. 小事一樁,把螢幕傳給你,準備接受 case Server.ReadInteger of CM_GETSCREEN: Result:=WriteImage(Server) ; end; Client: 3. 收到了,把它裝到RemoteJpegImage case CommandType of CM_GETSCREEN: Result:=ReadImage(Client); end; 得到螢幕圖像…. ququ 發表人 - ququd 於 2004/08/24 02:06:17
------
ququ
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-24 08:47:45 IP:220.131.xxx.xxx 未訂閱
ququd的BLOG 好棒: http://blog.csdn.net/ququd/archive/2004/08/08/68590.aspx    網海無涯,唯學是岸!
ququd
一般會員


發表:2
回覆:3
積分:1
註冊:2004-08-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-24 14:39:06 IP:61.182.xxx.xxx 未訂閱
可惜截取螢幕圖像有些問題. 程式截取到的是系統DC中的圖像 而當播放器播放檔時可能用到Directx等硬體加速,播放的圖像就不同過DC顯示 能幫寫個完美的捕捉程式? ququ
------
ququ
系統時間:2024-09-29 8:00:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!