DFMirage Mirror Driver是TightVNC用来抓屏的驱动,可以获取屏幕的变化区域,效率非常高。这个技术非常适合做远程监控、屏幕录制之类的软件。由于TigntVNC是C++的,对于不熟悉C++的DELPHI fans会有点麻烦。这个实例就是参照TightVNC中的代码翻译过来的,希望大家能用得上。
使用前请先安装驱动:
http://demoforge.com/dfmirage.htm
{
DFMirage Driver class for delphi
DFMirage is "cutting edge" video driver mirroring technology for the Windows NT OS family.
It is a driver for a virtual video device managed at the DDML level of the graphics system
that exactly mirrors the drawing operations of one or more physical display devices.
A detailed explanation of how a mirroring video driver works may be found in the Windows DDK.
more information by
http://demoforge.com/dfmirage.htm
by heroyin
E-MAIL: heroyin888@sina.com
}
unit VideoDriver;
interface
uses
SysUtils, Windows, Graphics;
const
ESC_QVI = 1026;
MAP1 = 1030;
UNMAP1 = 1031;
_TESTMAPPED = 1051;
MAXCHANGES_BUF = 20000;
const
dmf_dfo_IGNORE = 0;
dmf_dfo_FROM_SCREEN = 1;
dmf_dfo_FROM_DIB = 2;
dmf_dfo_TO_SCREEN = 3;
dmf_dfo_SCREEN_SCREEN = 11;
dmf_dfo_BLIT = 12;
dmf_dfo_SOLIDFILL = 13;
dmf_dfo_BLEND = 14;
dmf_dfo_TRANS = 15;
dmf_dfo_PLG = 17;
dmf_dfo_TEXTOUT = 18;
dmf_dfo_Ptr_Engage = 48; // point is used with this record
dmf_dfo_Ptr_Avert = 49;
// 1.0.9.0
// mode-assert notifications to manifest PDEV limbo status
dmf_dfn_assert_on = 64; // DrvAssert(TRUE): PDEV reenabled
dmf_dfn_assert_off = 65; // DrvAssert(FALSE): PDEV disabled
const
CDS_UPDATEREGISTRY = $00000001;
CDS_TEST = $00000002;
CDS_FULLSCREEN = $00000004;
CDS_GLOBAL = $00000008;
CDS_SET_PRIMARY = $00000010;
CDS_RESET = $40000000;
CDS_SETRECT = $20000000;
CDS_NORESET = $10000000;
type
{
typedef BOOL (WINAPI* pEnumDisplayDevices)(PVOID,DWORD,PVOID,DWORD);
typedef LONG (WINAPI* pChangeDisplaySettingsEx)(LPCTSTR, LPDEVMODE, HWND, DWORD, LPVOID);
}
//**********
PCHANGES_RECORD = ^CHANGES_RECORD;
CHANGES_RECORD = record
_type: ULONG; //screen_to_screen, blit, newcache,oldcache
rect: TRECT;
origrect: TRECT;
point: TPOINT;
color: ULONG; //number used in cache array
refcolor: ULONG; //slot used to pase btimap data
end;
PCHANGES_BUF = ^CHANGES_BUF;
CHANGES_BUF = record
counter: ULONG;
pointrect: array [0..MAXCHANGES_BUF-1] of CHANGES_RECORD;
end;
PGETCHANGESBUF = ^GETCHANGESBUF;
GETCHANGESBUF = record
buffer: PCHANGES_BUF;
Userbuffer: Pointer;
end;
const
DMF_PROTO_VER_CURRENT = (1 shl 24) or (2 shl 16) or (0 shl 8) or 0;
DMF_PROTO_VER_MINCOMPAT = (0 shl 24) or (9 shl 16) or (0 shl 8) or 1;
type
Esc_dmf_Qvi_IN = record
cbSize: ULONG;
app_actual_version: ULONG;
display_minreq_version: ULONG;
connect_options: ULONG; // reserved. must be 0.
end;
const
esc_qvi_prod_name_max = 16;
ESC_QVI_PROD_MIRAGE = 'MIRAGE';
type
Esc_dmf_Qvi_OUT = recor