用Delphi实现远程屏幕抓取

合集下载

用Delphi实现远程控制

用Delphi实现远程控制

用Delphi实现远程控制WinSock是一组API,用于在网络上传输数据和交换信息。

虽然现在有很多工具如FTP程序可以在网络上传输数据和文件,但是通过WinSock编程有更大的灵活性,它不需要关心网络连接的细节,然而用WinSock编程却很复杂,但是在Delphi中我们并不需要直接与WinSock的API打交道,因为TClientSocket元件和TServerSocket元件(在Internet页)封装了WinSock的大部分API,使得对WinSock的访问大大简化。

下面这个远程控制的例子就很清楚地说明了这个问题,它可以发送一个消息给对方,并能够使对方的电脑关闭、重新启动或重新登录。

一、实现原理---- 实行远程控制,实际上就是一个服务器程序(以下简称被控程序)和一个客户程序(以下简称主控程序):被控方即为服务器程序,它监听客户的请求,并作出处理;主控方即为客户程序,它连接上服务器后,发出自己的请求,服务器便根据自已的请求进行不同的响应。

二、编写主控程序---- 1、新建一个项目Client.dpr,并把一个TClientSocket元件放到Form上,它的属性设置如下:Port设为100(端口号可任意设置,只要求双方统一),其它属性按默认值。

在窗体上添加两个TEdit:Edit1用来输入发送的字符,Edit2用来输入IP地址;添加两个TButton:Button1点击后用来连接被控机,Button2点击后用来发送字符,然后声明一个私有变量ConnectFlag,表示双方是否连接好:privateConnectFlag:Boolean;---- 2、ClientSocket1的OnConnect事件代码如下:procedure TForm1.ClientSocket1Connect(Sender: TObject;Socket: TCustomWinSocket);beginConnectFlag:=True; //表示连接成功end;---- 3、ClientSocket1的OnError事件代码如下:procedure TForm1.ClientSocket1Error(Sender: TObject;Socket: TCustomWinSocket; ErrorEvent:TErrorEvent;var ErrorCode: Integer);beginApplication.MessageBox(PChar(' 不能连接到IP地址 : ' + Edit2.Text+'。

delphi多点触控事件用法

delphi多点触控事件用法

delphi多点触控事件用法Delphi多点触控事件用法在今天的世界里,多点触控的使用已经成为一种普遍的技术了。

根据不同的平台和操作系统,各种多点触控技术为用户提供了更好的灵活性和更高效的用户体验。

Delphi多点触控技术也是如此,它为开发者们提供了更多的技术手段,使得开发者们能够创造出更加引人入胜的产品。

在本文中,我们将介绍一下Delphi多点触控事件的使用方法。

首先,我们需要知道一些基本的概念,以便在使用Delphi多点触控时有一个稳定的基础。

首先,我们先介绍一下什么是多点触控,多点触控是指同时跟踪多个触摸板的触摸位置,检测多个触摸点,并将其映射到屏幕上。

Delphi的多点触控技术支持最多32个触点,并提供了专门的事件来捕捉多点触控信息。

使用Delphi多点触控可以创建出更加逼真的体验,它可以更好地用于模拟实际环境,比如滑动、缩放、旋转等,大大提高了用户体验。

下面介绍一下Delphi多点触控事件的用法。

Delphi多点触控事件是一种内置的事件,它可以让开发者记录多点触控的操作,并以事件的形式输出。

该事件可以捕获多点触控的操作,包括按压、移动和释放,可以帮助开发者构建更加智能和更具可定制性的应用。

其中,多点触控按压事件是指触摸操作的开始,它会提示开发者触摸设备发出的第一次触发信号。

当触摸设备发出按压信号时,Delphi会触发按压事件,并在事件中返回相应的触点坐标。

另外,多点触控移动事件是指触摸操作过程中的触发信号,该事件会跟踪不同触点的信号,并在事件中返回相应的触点坐标和移动位置。

最后,多点触控释放事件是指触摸操作结束的触发信号,在这种情况下,Delphi将会触发释放事件,并在事件中返回相关的触点坐标。

综上所述,Delphi多点触控事件的使用可以为开发者们提供更多的技术手段,让开发者们能够更好更快地构建出更加出色的应用程序。

无论是模拟实际环境,还是创造出更增加可定制性的功能,Delphi多点触控事件都能帮助开发者们轻松实现。

delphi屏幕截图完美解决方案

delphi屏幕截图完美解决方案

delphi屏幕截图完美解决方案可以截取layered窗口(包括透明窗口)的代码:procedure CaptureScreen(AFileName: string); constCAPTUREBLT = $40000000;varhdcScreen: HDC;hdcCompatible: HDC;bmp: TBitmap;hbmScreen: HBITMAP;beginhdcScreen := CreateDC('DISPLAY', nil, nil, nil); hdcCompatible := CreateCompatibleDC(hdcScreen); hbmScreen := CreateCompatibleBitmap(hdcScreen, GetDeviceCaps(hdcScreen, HORZRES), GetDeviceCaps(hdcScreen, VERTRES)); SelectObject(hdcCompatible, hbmScreen);bmp := TBitmap.Create;bmp.Handle := hbmScreen;BitBlt(hdcCompatible,0, 0,bmp.Width, bmp.Height,hdcScreen,0, 0,SRCCOPY or CAPTUREBLT);bmp.SaveToFile(AFileName);bmp.Free;DeleteDC(hdcScreen);DeleteDC(hdcCompatible);end;DX Primary Surface截图代码!包含DX8与DX9两个版本...interface{$DEFINE D3D9}usesWindows, Messages, SysUtils, Variants, Classes, Graphics, Co ntrols, Forms,Dialogs, StdCtrls, Buttons,{$IFDEF D3D9}// D3DX9, // use D3D to save surfaceDirect3D9{$ELSE}// D3DX8, // use D3D to save surfaceDirect3D8{$ENDIF};...procedure TForm1.BitBtn1Click(Sender: TObject);// Capture screen through D3D.varBitsPerPixel: Byte;{$IFDEF D3D9}pD3D: IDirect3D9;pSurface: IDirect3DSurface9;g_pD3DDevice: IDirect3DDevice9;{$ELSE}pD3D: IDirect3D8;pSurface: IDirect3DSurface8;g_pD3DDevice: IDirect3DDevice8;{$ENDIF}D3DPP: TD3DPresentParameters;ARect: TRect;LockedRect: TD3DLockedRect;BMP: TBitmap;i, p: Integer;beginBitsPerPixel := GetDeviceCaps(Canvas.Handle, BITSPIXEL);FillChar(d3dpp, SizeOf(d3dpp), 0);D3DPP.Windowed := True;D3DPP.Flags := D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;D3DPP.SwapEffect := D3DSWAPEFFECT_DISCARD;D3DPP.BackBufferWidth := Screen.Width;D3DPP.BackBufferHeight := Screen.Height;D3DPP.BackBufferFormat := D3DFMT_X8R8G8B8;{$IFDEF D3D9}pD3D := Direct3DCreate9(D3D_SDK_VERSION);pD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_ HAL, GetDesktopWindow,D3DCreate_SOFTWARE_VERTEXPROCESSING, @D3DPP, g_p D3DDevice);g_pD3DDevice.CreateOffscreenPlainSurface(Screen.Width, S creen.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, pSurfa ce, nil);g_pD3DDevice.GetFrontBufferData(0, pSurface);{$ELSE}pD3D := Direct3DCreate8(D3D_SDK_VERSION);pD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_ REF, GetDesktopWindow,D3DCreate_SOFTWARE_VERTEXPROCESSING, D3DPP, g_pD3 DDevice);g_pD3DDevice.CreateImageSurface(Screen.Width, Screen.H eight, D3DFMT_A8R8G8B8, pSurface);g_pD3DDevice.GetFrontBuffer(pSurface);{$ENDIF}// use D3D to save surface. Notes: D3DX%ab.dll is required!// D3DXSaveSurfaceToFile('Desktop.bmp', D3DXIFF_BMP, p Surface, nil, nil);// use Bitmap to save surfaceARect := Screen.DesktopRect;pSurface.LockRect(LockedRect, @ARect, D3DLOCK_NO_DIR TY_Update or D3DLOCK_NOSYSLOCK or D3DLOCK_READONLY);BMP := TBitmap.Create;BMP.Width := Screen.Width;BMP.Height := Screen.Height;BMP.PixelFormat := pf32bit;p := Cardinal(LockedRect.pBits);for i := 0 to Screen.Height - 1 dobeginCopyMemory(BMP.ScanLine[i], Ptr(p), Screen.Width * BitsPer Pixel div 8);p := p + LockedRect.Pitch;end;BMP.SaveToFile('Desktop.bmp');BMP.Free;pSurface.UnlockRect;end;以上DX截图代码,不需要额外的DLL支持,有DirectX 9.0即可采用上面的2个方案以外,还有些视频播放器的图像不能截取吧,呵呵怎么解决呢?它们使用的,是称为"覆盖表面"的技术,截取覆盖表面,需要Hook的手段才行思路是:通过Hook DDraw的DirectDrawCreate(RealOne用)同DirectDrawCreateEx(WMP用)获得IDirectDraw(7)再COM Hook CreateSurface,注意RealOne使用的是通过QueryInterface获得IDirectDraw2WMP则是IDirectDraw7Hook了CreateSurface后,就能获得OverlaySurface所以必须在软件使用前,启动全局Hook,才有效在需要截图的时候Lock Overlay Surface,读取数据,马上Unlock,以免损失性能解码读出来的数据,即可,但是由于获得的数据是显卡硬件VRAM的数据,一般是YUY2,YV12等格式,需要转换为RGB格式例如,在我的GF6600上,RealOne(RMVB)用的是YUY2,而WMP(AVI)用的是YV12,还与当前播放的文件格式有关提供主表面截图源码和覆盖表面截图的测试程序现在支持YV12,NV12,YUY2,UUVY 4个格式powered by LYSoft Liu Yang 可以截取layered窗口(包括透明窗口)的代码:procedure CaptureScreen(AFileName: string);constCAPTUREBLT = $40000000;varhdcScreen: HDC;hdcCompatible: HDC;bmp: TBitmap;hbmScreen: HBITMAP;beginhdcScreen := CreateDC('DISPLAY', nil, nil, nil);hdcCompatible := CreateCompatibleDC(hdcScreen);hbmScreen := CreateCompatibleBitmap(hdcScreen,GetDeviceCaps(hdcScreen, HORZRES),GetDeviceCaps(hdcScreen, VERTRES));SelectObject(hdcCompatible, hbmScreen);bmp := TBitmap.Create;bmp.Handle := hbmScreen;BitBlt(hdcCompatible,0, 0,bmp.Width, bmp.Height,hdcScreen,0, 0,SRCCOPY or CAPTUREBLT);bmp.SaveToFile(AFileName);bmp.Free;DeleteDC(hdcScreen);DeleteDC(hdcCompatible);end;DX Primary Surface截图代码!包含DX8与DX9两个版本...interface{$DEFINE D3D9}usesWindows, Messages, SysUtils, Variants, Classes, Graphics, Co ntrols, Forms,Dialogs, StdCtrls, Buttons,{$IFDEF D3D9}// D3DX9, // use D3D to save surfaceDirect3D9{$ELSE}// D3DX8, // use D3D to save surfaceDirect3D8{$ENDIF};...procedure TForm1.BitBtn1Click(Sender: TObject);// Capture screen through D3D.varBitsPerPixel: Byte;{$IFDEF D3D9}pD3D: IDirect3D9;pSurface: IDirect3DSurface9;g_pD3DDevice: IDirect3DDevice9;{$ELSE}pD3D: IDirect3D8;pSurface: IDirect3DSurface8;g_pD3DDevice: IDirect3DDevice8;{$ENDIF}D3DPP: TD3DPresentParameters;ARect: TRect;LockedRect: TD3DLockedRect;BMP: TBitmap;i, p: Integer;beginBitsPerPixel := GetDeviceCaps(Canvas.Handle, BITSPIXEL); FillChar(d3dpp, SizeOf(d3dpp), 0);D3DPP.Windowed := True;D3DPP.Flags := D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; D3DPP.SwapEffect := D3DSWAPEFFECT_DISCARD;D3DPP.BackBufferWidth := Screen.Width;D3DPP.BackBufferHeight := Screen.Height;D3DPP.BackBufferFormat := D3DFMT_X8R8G8B8;{$IFDEF D3D9}pD3D := Direct3DCreate9(D3D_SDK_VERSION);pD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_ HAL, GetDesktopWindow,D3DCreate_SOFTWARE_VERTEXPROCESSING, @D3DPP, g_p D3DDevice);g_pD3DDevice.CreateOffscreenPlainSurface(Screen.Width, S creen.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, pSurfa ce, nil);g_pD3DDevice.GetFrontBufferData(0, pSurface);{$ELSE}pD3D := Direct3DCreate8(D3D_SDK_VERSION);pD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_ REF, GetDesktopWindow,D3DCreate_SOFTWARE_VERTEXPROCESSING, D3DPP, g_pD3 DDevice);g_pD3DDevice.CreateImageSurface(Screen.Width, Screen.H eight, D3DFMT_A8R8G8B8, pSurface);g_pD3DDevice.GetFrontBuffer(pSurface);{$ENDIF}// use D3D to save surface. Notes: D3DX%ab.dll is required!// D3DXSaveSurfaceToFile('Desktop.bmp', D3DXIFF_BMP, p Surface, nil, nil);// use Bitmap to save surfaceARect := Screen.DesktopRect;pSurface.LockRect(LockedRect, @ARect, D3DLOCK_NO_DIR TY_Update or D3DLOCK_NOSYSLOCK or D3DLOCK_READONLY);BMP := TBitmap.Create;BMP.Width := Screen.Width;BMP.Height := Screen.Height;BMP.PixelFormat := pf32bit;p := Cardinal(LockedRect.pBits);for i := 0 to Screen.Height - 1 dobeginCopyMemory(BMP.ScanLine[i], Ptr(p), Screen.Width * BitsPer Pixel div 8);p := p + LockedRect.Pitch;end;BMP.SaveToFile('Desktop.bmp');BMP.Free;pSurface.UnlockRect;end;以上DX截图代码,不需要额外的DLL支持,有DirectX 9.0即可采用上面的2个方案以外,还有些视频播放器的图像不能截取吧,呵呵怎么解决呢?它们使用的,是称为"覆盖表面"的技术,截取覆盖表面,需要Hook的手段才行思路是:通过Hook DDraw的DirectDrawCreate(RealOne用)同DirectDrawCreateEx(WMP用)获得IDirectDraw(7)再COM Hook CreateSurface,注意RealOne使用的是通过QueryInterface获得IDirectDraw2WMP则是IDirectDraw7Hook了CreateSurface后,就能获得OverlaySurface所以必须在软件使用前,启动全局Hook,才有效在需要截图的时候Lock Overlay Surface,读取数据,马上Unlock,以免损失性能解码读出来的数据,即可,但是由于获得的数据是显卡硬件VRAM的数据,一般是YUY2,YV12等格式,需要转换为RGB格式例如,在我的GF6600上,RealOne(RMVB)用的是YUY2,而WMP(AVI)用的是YV12,还与当前播放的文件格式有关提供主表面截图源码和覆盖表面截图的测试程序现在支持YV12,NV12,YUY2,UUVY 4个格式powered by LYSoft Liu Yang。

Delphi抓屏开发

Delphi抓屏开发

四种抓屏效果开发抓全屏幕procedure CatchFullScreen;varDesktopDC: HDC;bmp: TBitmap;beginDesktopDC := GetDC(0);bmp := TBitmap.Create;tryself.Hide; bmp.PixelFormat := pf24bit; bmp.Width := Screen.Width; bmp.Height :=Screen.Height; bmp.Canvas.Brush.Style := bsClear;//CAPTUREBLT 为抓透明窗体,如果不抓透明窗体,则去掉该标识,该标识需要自定义BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DesktopDC, 0, 0, SRCCOPY or CAPTUREBLT);// 存到剪切板Clipboard.Assign(bmp); bmp.SaveToFile(BmpFileName);finallybmp.Free;ReleaseDC(0, DesktopDC);self.Show;end;end;窗口抓屏procedure CapWindowClick(var msg: TMsg); message UM_LBUTTONDOWN;const{$ifndef CAPTUREBLT}CAPTUREBLT = $40000000;{$endif}RCCORE_DLL_NAME = 'MouseHook.dll';varLibHandle: THandle;//DLL 句柄SetHook: TSetHook;RemoveHook: TRemoveHook;LastBmp: TBitmap;LastHandle: HWND;Rect, RectDis: TRect;procedure TForm1.CatchWindow;varLastHandle: HWND;DesktopDC: HDC;DCCanvas: TCanvas;beginself.Hide;LastHandle := 0;DCCanvas := TCanvas.Create;DCCanvas.Handle := DesktopDC;DCCanvas.Brush.Style := bsClear;Timer1.Enabled := True;// 设置鼠标钩子SetHook;end; procedure TForm1.LoadDll;begintryLibHandle := LoadLibrary(RCCORE_DLL_NAME);if LibHandle = 0 thenbegin ShowMessage('"' + RCCORE_DLL_NAME + '" 载入失败!'); Exit;end;@SetHook := GetProcAddress(LibHandle, PChar('SetHook'));@RemoveHook := GetProcAddress(LibHandle, PChar('RemoveHook')); exceptShowMessage('dll 载入失败!');end;end;procedure TForm1.Timer1Timer(Sender: TObject);varPos: TPoint;Handle: HWND;beginGetCursorPos(Pos); // 得到当前光标位置Handle := WindowFromPoint(Pos); // 返回当前位置的句柄if LastHandle <> Handle thenbeginif LastHandle <> 0 thenbeginDCCanvas.CopyRect(Rect, LastBmp.Canvas, LastBmp.Canvas.ClipRect); end;LastHandle := Handle; GetWindowRect(Handle, Rect);LastBmp.FreeImage;LastBmp.Width := Rect.Right - Rect.Left;LastBmp.Height := Rect.Bottom - Rect.Top;BitBlt(LastBmp.Canvas.Handle, 0, 0,Rect.Right - Rect.Left,Rect.Bottom - Rect.Top,DCCanvas.Handle,Rect.Left,Rect.Top,SRCCOPY or CAPTUREBLT);RectDis.Left := Rect.Left + 2;RectDis.Top := Rect.Top + 2;RectDis.Right := REct.Right - 2;RectDis.Bottom := REct.Bottom - 2;DCCanvas.Pen.Width := 2;DCCanvas.Pen.Style := psSolid;DCCanvas.Pen.Color := clRed;DCCanvas.Rectangle(RectDis);end;end;procedure TForm1.CapWindowClick(var msg: TMsg);beginRemoveHook;Timer1.Enabled := False;DCCanvas.CopyRect(Rect, LastBmp.Canvas, LastBmp.Canvas.ClipRect);BitBlt(LastBmp.Canvas.Handle, 0, 0,Rect.Right - Rect.Left,Rect.Bottom - Rect.Top,DCCanvas.Handle,Rect.Left,Rect.Top,SRCCOPY or CAPTUREBLT);Clipboard.Assign(LastBmp);LastBmp.SaveToFile(TempBmpName);self.Show;end;procedure TForm1.FormCreate(Sender: TObject);beginLastBmp := TBitmap.Create;LastBmp.PixelFormat := pf24bit;LastBmp.Width := Screen.Width;LastBmp.Height := Screen.Height;LastBmp.Canvas.Brush.Style := bsClear;DesktopDC := GetDC(0);// 载入鼠标钩子动态库LoadDll;end;procedure TForm1.FormDestroy(Sender: TObject);beginReleaseDC(0, DesktopDC);LastBmp.Free;FreeDll;end;鼠标钩子动态库library MouseHook;{ Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes.ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information usingPChar or ShortString parameters. }usesSysUtils, Classes, Windows, Messages;constUM_LBUTTONDOWN = WM_USER + 1000;varHooked: Boolean; hHook: Integer;{$R *.res}function HookProc(code: Integer; wp: WPARAM; lp: LPARAM): LRESULT; stdcall; var hr: HWND;beginif (wp = WM_LBUTTONDOWN) thenbeginhr := FindWindow('TForm1', 'Form1'); if hr <> 0 thenSendMessage(hr, UM_LBUTTONDOWN, 0, 0); end;// 鼠标是公用资源,慎重使用。

delphi实现屏幕截图

delphi实现屏幕截图

delphi实现屏幕截图(1)新建工程,设置主界面form1的BoardStyle为bsNone,FormStyle为fsStayOnTop,WindowState为wsMaximized。

(2)在form1中放置Image1,设置其AutoSize为True。

(3)在form1的OnCreate事件中截取全屏,并将截到的图片放置在image1中。

procedure TForm1.FormCreate(Sender: TObject);varbmp: TBitMap;beginbmp:= TBitMap.Create;GetScreen(bmp);image1.Picture:= TPicture(bmp);end;其中,截取全屏的过程GetScreen(var bmp: TBitMap)定义如下:procedure GetScreen(var bmp: TBitMap); //截取全屏varDC: HDC;MyCanvas: TCanvas;MyRect: TRect;beginDC:= GetWindowDC(0);MyCanvas:= TCanvas.Create;tryMyCanvas.Handle:= DC;MyRect:= Rect(0, 0, Screen.Width, Screen.Height);bmp:= TBitMap.Create;bmp.PixelFormat:= pf24bit;bmp.Width:= MyRect.Right;bmp.Height:= MyRect.Bottom;bmp.Canvas.CopyRect(MyRect, MyCanvas, MyRect);finallyMyCanvas.Handle:= 0;MyCanvas.Free;releaseDC(0, DC);end;end;(4)在image1的OnMouseDown事件里获取区域的初始值,并分别用全局变量pt,Endpt,rect_保存初始点,终止点和区域。

rdp delphi实现远程桌面

rdp delphi实现远程桌面

rdp delphi实现远程桌面rdp delphi实现远程桌面博客分类:other1. 首先确保你的机器上存在mstscax.dll,如果没有这个文件,可以从/download/whistler/tools/1.0/ wxp/en-us/msrdpcli.exe下载并安装远程桌面连接软件.或者使用WindowXP中自带的mstscax.dll,运行regsvr32 mstscax.dll进行注册,ccrun测试使用的mstscax.dll版本号是5.1.2600.0,在Windows2000 Server中可以编译。

2. 运行delphi 7--&gt;Components--&gt;Import Active Control,在列表中找到下面的Microsoft Terminal Services Active Client 1.0 Type Library (Version 1.0),点击install,你可以选择将其安装到现在的包中,也可以新建一个,选择Into new package--&gt;点击Browser将其保存为D:Program FilesBorlandccrunmstscmstsc.bpk。

在Description一栏可以填:Microsoft Terminal Service Control,这个名称将出现在安装完成后的Package列表中。

点击OK以后,稍等片刻,系统会提示mstsc.bpl将被编译并且安装,是否继续,点击yes。

这时如果一切正常的话,系统将提示有两个编译错误(嘿嘿,我指的是正常情况下),难道是BCB的BUG?提示找不到OlePrecedure的定义。

我靠。

记忆中有个OleProcedure,一个o,一个e,该不会真的是笔误吧。

将两处OlePrecedure 换成OleProcedure,再次编译,ok了,编译成功,点击Install 安装。

利用Delphi的多线程编程技术实现远程实时监控

利用Delphi的多线程编程技术实现远程实时监控

第13 卷第6 期2003 年6 月微机发展Microcomputer DevelopmentVol. 13 No. 6J une 2003利用Delphi 的多线程编程技术实现远程实时监控李长河, 申小玲(西安理工大学计算机科学与工程系,陕西西安710048)摘要:提出了采用多线程编程的设计思路去完成系统的远程监控。

阐述了多线程编程技术及其应用领域,又以通信电源集中监控系统为例,说明了如何利用Delphi 的多线程编程技术实现远程实时监控。

通过使用多线程编程技术,不仅保证了前、后台协同工作,使应用程序的CPU 利用率大大提高,而且加快了信息的处理速度,同时也提高了实时性。

关键词:进程;多线程;实时监控;同步实现中图分类号: T P31111 文献标识码:A 文章编号:1005 - 3751 (2003) 06 - 0034 - 03Implementation Remote Real2time Supervision by UsingMultithreading Programming Technology in DelphiL I Chang2he ,SHEN Xiao2ling( Institute of Computer Science and Engineering ,Xi’an University of Technology , Xi’an 710048 ,China)Abstract:Presents that the utilization of multithreading programming technology is to complete remote control in real - time system. It discusses multithreading programming technology and its application f ield. Also , it argues how to implement remote control in communica2 tion power supply supervision systems by the method f or designing multithreading applications in Delphi. By the method f or designing mul2 tithreading application , it makes f oreground application and background application cooperated and improves greatly CPU efficiency. Also , it accelerat es inf orm ation process and enhances real - time perf orm ance.Ke y words :process ; multithreading ; real - time supervision ; synchronization implementation0 引言随着计算机通信网络技术以及分布式实时监控系统的不断发展,并发多任务程序设计技术在程序设计中占有的地位越来越重要。

delphi视频捕获

delphi视频捕获

视频捕获软件开发完全教学内容目录一. 视频捕获快速入门2二.基本的捕获设置31.设置捕获速度:32.设置终止捕获43.捕获的时间限制4三.关于捕获窗口41.创建一个AVICAP捕获窗口 52.将一个捕获窗口连接至捕获设备53.父窗口与子窗口的交互54.捕获窗口的状态6四.视频捕获驱动和音频驱动61.视频捕获驱动的性能: 62.视频对话框: 63.PREVIEW 和OVERLAY模式: 74.视频格式75.视频捕获设置76.声频格式8五.使用视频捕获81.创建捕获窗口(CREATING A CAPTURE WINDOW) 82.连接到捕获驱动(CONNECTING TO A CAPTURE DRIVER) 93.列举所有已安装的捕获驱动(ENUMERATING INSTALLED CAPTURE DRIVERS) 94.得到捕获驱动的性能(OBTAINING THE CAPABILITIES OF A CAPTURE DRIVER) 95.得到捕获窗口的状态(OBTAINING THE STATUS OF A CAPTURE WINDOW) 106.显示对话框设置视频特征(DISPLAYING DIALOG BOXES TO SET VIDEO CHARACTERISTICS) 107.得到和设置视频格式(OBTAINING AND SETTING THE VIDEO FORMAT) 118. 预览视频(PREVIEWING VIDEO) 129.将视频设置为OVERLAY模式(ENABLING VIDEO OVERLAY) 1210.命名捕获文件(NAMING THE CAPTURE FILE) 1211.格式化声频捕获(FORMATTING AUDIO CAPTURE) 1212.改变视频捕获设置(CHANGING A VIDEO CAPTURE SETTING) 1313.捕获数据(CAPTURING DATA) 1314.增加一个信息块(ADDING AN INFORMATION CHUNK) 1415.在程序中加入一个回调函数(ADDING CALLBACK FUNCTIONS TO AN APPLICATION) 1416.创建一个状态回调函数(CREATING A STATUS CALLBACK FUNCTION) 1617.创建一个错误回调函数( CREATING AN ERROR CALLBACK FUNCTION) 1718.创建一个框架回调函数(CREATING A FRAME CALLBACK FUNCTION) 18六.将四个标准对话框改成函数调用形式18AUDIOFORMAT对话框19VIDEOFORMAT对话框19VIDEOSOURCE对话框20VIDEO COMPRESSION对话框20前言视频捕获是指由专用的视频采集卡捕获声频和视频信息,然后将其进行数据化处理,再经过软件的压缩进行处理,这时就可对这些数据进行保存、回放、传输等各种操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

在网络管理中,有时需要通过监视远程计算机屏幕来了解网上微机的使用情况。

虽然,市面上有很多软件可以实现该功能,有些甚至可以进行远程控制,但在使用上缺乏灵活性,如无法指定远程计算机屏幕区域的大小和位置,进而无法在一屏上同时监视多个屏幕。

其实,可以用Delphi自行编制一个灵活的远程屏幕抓取工具,简述如下。

一、软硬件要求Windows95/98对等网,用来监视的计算机(以下简称主控机)和被监视的计算机(以下简称受控机)都必须装有TCP/IP 协议,并正确配置。

如没有网络,也可以在一台计算机上进行调试。

二、实现方法编制两个应用程序,一个为VClient.exe,装在受控机上,另一个为VServer.exe,装在主控机上。

VServer.exe指定要监视的受控机的IP地址和将要在受控机屏幕上抓取区域的大小和位置,并发出屏幕抓取指令给VClient.exe,VClient.exe得到指令后,在受控机屏幕上选取指定区域,生成数据流,将其发回主控机,并在主控机上显示出抓取区域的BMP图象。

由以上过程可以看出,该方法的关键有二:一是如何在受控机上进行屏幕抓取,二是如何通过TCP/IP协议在两台计算机中传输数据。

UDP(User Datagram Protocol,意为用户报文协议)是Internet上广泛采用的通信协议之一。

与TCP协议不同,它是一种非连接的传输协议,没有确认机制,可靠性不如TCP,但它的效率却比TCP高,用于远程屏幕监视还是比较适合的。

同时,UDP控件不区分服务器端和客户端,只区分发送端和接收端,编程上较为简单,故选用UDP协议,使用Delphi 4.0提供的TNMUDP控件。

三、创建演示程序第一步,编制VClient.exe文件。

新建Delphi工程,将默认窗体的Name属性设为“Client”。

加入TNMUDP控件,Name属性设为“CUDP”;LocalPort 属性设为“1111”,让控件CUDP监视受控机的1111端口,当有数据发送到该口时,触发控件CUDP的OnDataReceived事件;RemotePort属性设为“2222”,当控件CUDP发送数据时,将数据发到主控机的2222口。

在implementation后面加入变量定义const BufSize=2048;{ 发送每一笔数据的缓冲区大小 }varBmpStream:TMemoryStream;LeftSize:Longint;{ 发送每一笔数据后剩余的字节数 }为Client的OnCreate事件添加代码:procedure TClient.FormCreate(Sender: TObject);beginBmpStream:=TMemoryStream.Create;end;为Client的OnDestroy事件添加代码:procedure TClient.FormDestroy(Sender: TObject);beginBmpStream.Free;end;为控件CUDP的OnDataReceived事件添加代码:procedure TClient.CUDPDataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String);varCtrlCode:array[0..29] of char;Buf:array[0..BufSize-1] of char;TmpStr:string;SendSize,LeftPos,TopPos,RightPos,BottomPos:integer;beginCUDP.ReadBuffer(CtrlCode,NumberBytes);{ 读取控制码 }if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]='show' then begin { 控制码前4位为“show”表示主控机发出了抓屏指令 }if BmpStream.Size=0 then { 没有数据可发,必须截屏生成数据 } beginTmpStr:=StrPas(CtrlCode);TmpStr:=Copy(TmpStr,5,Length(TmpStr)-4);LeftPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-Pos(':',TmpStr));TopPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-Pos(':',TmpStr));RightPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1)); BottomPos:=StrToInt(Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-Pos(':',TmpStr)));ScreenCap(LeftPos,TopPos,RightPos,BottomPos); {截取屏幕 }end;if LeftSize>BufSize then SendSize:=BufSizeelse SendSize:=LeftSize;BmpStream.ReadBuffer(Buf,SendSize);LeftSize:=LeftSize-SendSize;if LeftSize=0 then BmpStream.Clear;{ 清空流 }CUDP.RemoteHost:=FromIP; { FromIP为主控机IP地址 }CUDP.SendBuffer(Buf,SendSize); { 将数据发到主控机的2222口 }end;end;其中ScreenCap是自定义函数,截取屏幕指定区域,代码如下:procedure TClient.ScreenCap(LeftPos,TopPos,RightPos,BottomPos:integer);varRectWidth,RectHeight:integer;SourceDC,DestDC,Bhandle:integer;Bitmap:TBitmap;beginRectWidth:=RightPos-LeftPos;RectHeight:=BottomPos-TopPos;SourceDC:=CreateDC('DISPLAY','','',nil);DestDC:=CreateCompatibleDC(SourceDC);Bhandle:=CreateCompatibleBitmap(SourceDC,RectWidth,RectHeight);SelectObject(DestDC,Bhandle);BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,LeftPos,TopPos,SRCCOPY);Bitmap:=TBitmap.Create;Bitmap.Handle:=BHandle;BitMap.SaveToStream(BmpStream);BmpStream.Position:=0;LeftSize:=BmpStream.Size;Bitmap.Free;DeleteDC(DestDC);ReleaseDC(Bhandle,SourceDC);end;存为“C:\VClient\ClnUnit.pas”和“C:\VClient\VClient.dpr”,并编译。

第二步,编制VServer.exe文件。

新建Delphi工程,将窗体的Name属性设为“Server”。

加入TNMUDP控件,Name属性设为“SUDP”;LocalPort属性设为“2222”,让控件SUDP监视主控机的2222端口,当有数据发送到该口时,触发控件SUDP的OnDataReceived事件;RemotePort属性设为“1111”,当控件SUDP发送数据时,将数据发到受控机的1111口。

加入控件Image1,Align属性设为“alClient”;加入控件Button1,Caption属性设为“截屏”;加入控件Label1,Caption属性设为“左:上:右:下”;加入控件Edit1,Text属性设为“0:0:100:100”;加入控件Label2,Caption属性设为“受控机IP地址”;加入控件Edit2,Text属性设为“127.0.0.1”;在implementation后面加入变量定义const BufSize=2048;varRsltStream,TmpStream:TMemoryStream;为Server的OnCreate事件添加代码:procedure TServer.FormCreate(Sender: TObject);beginRsltStream:=TMemoryStream.Create;TmpStream:=TMemoryStream.Create;end;为Client的OnDestroy事件添加代码:procedure TServer.FormDestroy(Sender: TObject);beginRsltStream.Free;TmpStream.Free;end;为控件Button1的OnClick事件添加代码:procedure TServer.Button1Click(Sender: TObject);var ReqCode:array[0..29] of char;ReqCodeStr:string; beginReqCodeStr:='show'+Edit1.Text;StrpCopy(ReqCode,ReqCodeStr);TmpStream.Clear;RsltStream.Clear;SUDP.RemoteHost:=Edit2.Text;SUDP.SendBuffer(ReqCode,30);end;为控件SUDP的OnDataReceived事件添加代码:procedure TServer.SUDPDataReceived(Sender: TComponent; NumberBytes: Integer; FromIP: String);var ReqCode:array[0..29] of char;ReqCodeStr:string; beginReqCodeStr:='show'+Edit1.text;StrpCopy(ReqCode,ReqCodeStr);SUDP.ReadStream(TmpStream);RsltStream.CopyFrom(TmpStream,NumberBytes);if NumberBytes< BufSize then { 数据已读完 }beginRsltStream.Position:=0;Image1.Picture.Bitmap.LoadFromStream(RsltStream);TmpStream.Clear;RsltStream.Clear;endelsebeginTmpStream.Clear;ReqCode:='show';SUDP.RemoteHost:=Edit2.Text;SUDP.SendBuffer(ReqCode,30);end;end;存为“C:\VServer\SvrUnit.pas”和“C:\VServer\VServer.dpr”,并编译。

相关文档
最新文档