c++代码高效屏幕录制,高手帮忙携程delphi的,谢谢!

piaoyang80 2008-05-15 06:19:37

LPDIRECTDRAW lpDD = NULL;
LPDIRECTDRAWSURFACE lpDDSPrime = NULL;
LPDIRECTDRAWSURFACE lpDDSBack = NULL;
LPDIRECTDRAWSURFACE lpDDSGdi = NULL;
LPDIRECTDRAWSURFACE lpSurf = NULL;

DDSURFACEDESC DDSdesc;
BOOL m_b24=TRUE;
//rfbServerInitMsg m_scrinfo;
RECT m_bmrect;

struct _BMInfo {
BITMAPINFO bmi;
BOOL truecolour;
RGBQUAD cmap[256];
} m_bminfo; // 用来保存位图信息的结构




// DirectX初始化。返回当前表面获取一张屏幕位图的存储空间大小
int DX_Init()
{
HRESULT hr;
// 初始化directX
hr = DirectDrawCreate(0, &lpDD, 0);
if (FAILED(hr))
return FALSE;

hr = lpDD->SetCooperativeLevel(NULL, DDSCL_NORMAL);
if (FAILED(hr))
return FALSE;

ZeroMemory(&DDSdesc, sizeof(DDSdesc));
DDSdesc.dwSize = sizeof(DDSdesc);
DDSdesc.dwFlags = DDSD_CAPS;
DDSdesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
hr = lpDD->CreateSurface(&DDSdesc, &lpDDSPrime, 0);
if (FAILED(hr))
return FALSE;

hr = lpDD->GetGDISurface(&lpDDSGdi);
if (FAILED(hr))
return FALSE;

ZeroMemory(&DDSdesc, sizeof(DDSdesc));
DDSdesc.dwSize = sizeof(DDSdesc);
DDSdesc.dwFlags = DDSD_ALL;
hr = lpDDSPrime->GetSurfaceDesc(&DDSdesc);
if (FAILED(hr))
return FALSE;

// 初始化位图信息
if ((DDSdesc.dwFlags & DDSD_WIDTH) && (DDSdesc.dwFlags & DDSD_HEIGHT))
{
m_bmrect.left = m_bmrect.top = 0;
m_bmrect.right = DDSdesc.dwWidth;
m_bmrect.bottom = DDSdesc.dwHeight;
}
else
return FALSE;

m_bminfo.bmi.bmiHeader.biCompression = BI_RGB;//BI_BITFIELDS;
m_bminfo.bmi.bmiHeader.biBitCount = DDSdesc.ddpfPixelFormat.dwRGBBitCount;

//m_bminfo.truecolour = DDSdesc.ddpfPixelFormat.dwFlags & DDPF_RGB;
if(m_bminfo.bmi.bmiHeader.biBitCount > 8)
m_bminfo.truecolour = TRUE;
else
m_bminfo.truecolour = FALSE;

ZeroMemory(&DDSdesc, sizeof(DDSdesc));
DDSdesc.dwSize = sizeof(DDSdesc);
DDSdesc.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
DDSdesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
DDSdesc.dwHeight = m_bmrect.bottom - m_bmrect.top;
DDSdesc.dwWidth = m_bmrect.right - m_bmrect.left;
hr = lpDD->CreateSurface(&DDSdesc, &lpDDSBack, 0);
if (FAILED(hr))
return FALSE;
//hr = lpDDSPrime->QueryInterface( IID_IDirectDrawSurface3, (LPVOID *)&lpSurf);
//if (FAILED(hr))
// return FALSE;

switch (m_bminfo.bmi.bmiHeader.biBitCount)
{
case 32:
case 24:
// Update the bitmapinfo header
m_b24 = TRUE;
m_bminfo.bmi.bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
m_bminfo.bmi.bmiHeader.biWidth = 1024;
m_bminfo.bmi.bmiHeader.biHeight = 768;
m_bminfo.bmi.bmiHeader.biPlanes = 1;
// m_bminfo.bmi.bmiHeader.biBitCount = 24;
m_bminfo.bmi.bmiHeader.biCompression = BI_RGB;
m_bminfo.bmi.bmiHeader.biSizeImage =
abs((m_bminfo.bmi.bmiHeader.biWidth *
m_bminfo.bmi.bmiHeader.biHeight *
m_bminfo.bmi.bmiHeader.biBitCount)/ 8);
m_bminfo.bmi.bmiHeader.biXPelsPerMeter = (1024*1000)/1024;
m_bminfo.bmi.bmiHeader.biYPelsPerMeter = (768*1000)/768;
m_bminfo.bmi.bmiHeader.biClrUsed = 0;
m_bminfo.bmi.bmiHeader.biClrImportant = 0;
break;
}


return m_bminfo.bmi.bmiHeader.biSizeImage;
}
// 捕捉屏幕。rect: 区域。scrBuff: 输出缓冲。scrBuffSize: 缓冲区大小
BOOL CaptureScreen(RECT &rect, BYTE *scrBuff, UINT scrBuffSize)
{
HRESULT hr=0;

hr = lpDDSBack->BltFast(rect.left,rect.top,lpDDSPrime,&rect,DDBLTFAST_NOCOLORKEY | DDBLTFAST_WAIT);
if (FAILED(hr))
{
return FALSE;
}

DDSURFACEDESC surfdesc;
ZeroMemory(&surfdesc, sizeof(surfdesc));
surfdesc.dwSize = sizeof(surfdesc);

hr = lpDDSBack->Lock(&rect, &surfdesc, DDLOCK_READONLY | DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR /*|DDLOCK_NOSYSLOCK*/, NULL);
//hr = lpDDSPrime->Lock(&rect, &surfdesc, DDLOCK_READONLY | DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR /*|DDLOCK_NOSYSLOCK*/, NULL);
if (FAILED(hr))
return FALSE;

// copy the data into our buffer
BYTE * destbuffpos, * srcbuffpos;
// m_scrinfo.format.bitsPerPixel = 24;
srcbuffpos = (BYTE *) surfdesc.lpSurface;
destbuffpos = scrBuff;

memcpy( destbuffpos, srcbuffpos,m_bminfo.bmi.bmiHeader.biSizeImage);

// unlock the primary surface
//lpDDSPrime->Unlock(surfdesc.lpSurface);
lpDDSBack->Unlock(surfdesc.lpSurface);
return TRUE;
}


int SaveBitmapToFile(BITMAP *bitmap, LPSTR lpFileName,char *lpBuf)
{
DWORD dwWritten;
BITMAPFILEHEADER bmfHdr;
BITMAPINFOHEADER bi;
HANDLE fh=NULL;
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth= bitmap->bmWidth;
bi.biHeight = bitmap->bmHeight;
bi.biPlanes = 1;
bi.biBitCount =bitmap->bmBitsPixel*8;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE)
return FALSE;
bmfHdr.bfType = 0x4D42; // "BM"
bmfHdr.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+bitmap->bmWidth*bitmap->bmHeight*bitmap->bmBitsPixel;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER);
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
WriteFile(fh, (char *)&bi,sizeof(BITMAPINFOHEADER), &dwWritten, NULL);
WriteFile(fh, (char *)lpBuf,bitmap->bmWidth*bitmap->bmHeight*bitmap->bmBitsPixel, &dwWritten, NULL);
FlushFileBuffers(fh);
CloseHandle(fh);
return true;
}

int GetBitmapFromScreen(char *lpFileName)
{
char *lpBuf;
HBITMAP hBitmap,hOld ;
HDC hDC,hcDC;
BITMAP bb;BITMAPINFO b;
HANDLE hp,fh=NULL;
DWORD dwX,dwY;
//***************
dwX=GetSystemMetrics(SM_CXSCREEN);
dwY=GetSystemMetrics(SM_CYSCREEN);
hDC=GetDC(NULL);
hcDC=CreateCompatibleDC(hDC);
hBitmap=CreateCompatibleBitmap(hDC,dwX,dwY);
hOld=(HBITMAP)SelectObject(hcDC,hBitmap);
BitBlt(hcDC,0, 0,dwX,dwY, hDC, 0, 0, SRCCOPY);
bb.bmWidth=dwX;
bb.bmHeight =dwY;
bb.bmPlanes = 1;
bb.bmWidthBytes=bb.bmWidth*3;
bb.bmBitsPixel=3;
bb.bmType=0;
b.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
b.bmiHeader.biWidth=dwX;
b.bmiHeader.biHeight =dwY;
b.bmiHeader.biPlanes = 1;
b.bmiHeader.biBitCount =3*8;
b.bmiHeader.biCompression = BI_RGB;
b.bmiHeader.biSizeImage = 0;
b.bmiHeader.biXPelsPerMeter = 0;
b.bmiHeader.biYPelsPerMeter = 0;
b.bmiHeader.biClrUsed = 0;
b.bmiHeader.biClrImportant = 0;
b.bmiColors[0].rgbBlue=8;
b.bmiColors[0].rgbGreen=8;
b.bmiColors[0].rgbRed=8;
b.bmiColors[0].rgbReserved=0;
hp=GetProcessHeap();
lpBuf=(char *)HeapAlloc(hp,HEAP_ZERO_MEMORY,bb.bmHeight*bb.bmWidth*4);
GetDIBits(hcDC,hBitmap,0,dwY,lpBuf,&b,DIB_RGB_COLORS);
SaveBitmapToFile(&bb,lpFileName,lpBuf);
ReleaseDC(NULL,hDC);
DeleteDC(hcDC);
DeleteObject(hBitmap);
DeleteObject(hOld);
HeapFree(hp,0,lpBuf);
return true;
}


...全文
1100 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2012-10-18
  • 打赏
  • 举报
回复
经测试, 这个程序不能截取 DX播放的视频,或者游戏等. 功能根GDI截的图差不多.
changecode 2012-09-09
  • 打赏
  • 举报
回复
能录取到播放器的视频画面吗?采用硬件加速的情况下?
caacatmb 2010-04-05
  • 打赏
  • 举报
回复
不错的代码,研究研究
I_S_T_O 2010-01-25
  • 打赏
  • 举报
回复
不错不凑
daowuwei 2009-08-29
  • 打赏
  • 举报
回复
看看
僵哥 2009-07-14
  • 打赏
  • 举报
回复
function SaveBitmapToStream(bitmap:PBITMAP;DestStream: TStream;lpBuf: PChar): BOOL;
var
bmfHdr: BITMAPFILEHEADER;
bi: BITMAPINFOHEADER;
begin
Result := False;
bi.biSize := sizeof(BITMAPINFOHEADER);
bi.biWidth:= bitmap^.bmWidth;
bi.biHeight := bitmap^.bmHeight;
bi.biPlanes := 1;
bi.biBitCount :=bitmap^.bmBitsPixel*8;
bi.biCompression := BI_RGB;
bi.biSizeImage := 0;
bi.biXPelsPerMeter := 0;
bi.biYPelsPerMeter := 0;
bi.biClrUsed := 0;
bi.biClrImportant := 0;
bmfHdr.bfType := $4D42; // "BM"
bmfHdr.bfSize := sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+bitmap^.bmWidth*bitmap^.bmHeight*bitmap^.bmBitsPixel;
bmfHdr.bfReserved1 := 0;
bmfHdr.bfReserved2 := 0;
bmfHdr.bfOffBits := DWORD(sizeof(BITMAPFILEHEADER)) + DWORD(sizeof(BITMAPINFOHEADER));
DestStream.WriteBuffer(PChar(@bmfHdr)^, sizeof(BITMAPFILEHEADER));
DestStream.WriteBuffer(Pchar(@bi)^,sizeof(BITMAPINFOHEADER));
DestStream.WriteBuffer(Pchar(lpBuf)^,bitmap^.bmWidth*bitmap^.bmHeight*bitmap^.bmBitsPixel);
Result := true;
end;
genispan 2009-07-14
  • 打赏
  • 举报
回复
MARK
cn0754 2009-07-13
  • 打赏
  • 举报
回复
请教下unsigned 大大.你的Delphi版中的SaveBitmapToFile截屏如何改成保存成内存流或者TBITMAP.这个PBITMAP不懂,不知道如何处理才能实现成不保存文件,
zkbao 2008-11-19
  • 打赏
  • 举报
回复
mark
piaoyang80 2008-05-16
  • 打赏
  • 举报
回复
哈哈, 果然有牛人出现啊, 太感谢【unsigned 】了
gyk120 2008-05-15
  • 打赏
  • 举报
回复
牛人,膜拜一下
mark
天行归来 2008-05-15
  • 打赏
  • 举报
回复
僵哥 好人!mark一下
僵哥 2008-05-15
  • 打赏
  • 举报
回复
错了,是41~42毫秒^_^
僵哥 2008-05-15
  • 打赏
  • 举报
回复
测试了一下,速度还不错,如果不存盘,仅只是存到内存,包括HeapAlloc/HeapFree在内,一共使用了410719毫秒。平均4.1~4.1毫秒一幅.
僵哥 2008-05-15
  • 打赏
  • 举报
回复
如果释放有问题请在
...
end.

前加上
...
initialization
finalization
//lpSurf:= Nil;
lpDDSBack:= Nil;
lpDDSGdi := Nil;
lpDDSPrime := Nil;
lpDD:= Nil;
...
僵哥 2008-05-15
  • 打赏
  • 举报
回复
unit Unit4;

interface
uses
windows,DirectX;
type
RECT = TRect;
var
lpDD: IDirectDraw = Nil;
lpDDSPrime: IDIRECTDRAWSURFACE = Nil;
lpDDSBack: IDIRECTDRAWSURFACE = Nil;
lpDDSGdi: IDIRECTDRAWSURFACE = Nil;
lpSurf: IDIRECTDRAWSURFACE = Nil;

DDSdesc: TDDSURFACEDESC ;
m_b24: LongBOOL = TRUE;
//rfbServerInitMsg m_scrinfo;
m_bmrect: RECT;

type
_BMInfo = record
bmi: BITMAPINFO;
truecolour: LongBOOL;
cmap: array [0..256-1] of RGBQUAD;
end;
var
m_bminfo : _BMInfo; // 用来保存位图信息的结构






function DX_Init: DWORD;
function CaptureScreen(var rect: RECT; scrBuff: PBYTE; scrBuffSize: UINT): LongBool;
function SaveBitmapToFile(bitmap:PBITMAP;lpFileName: PChar;lpBuf: PChar): BOOL;
function GetBitmapFromScreen(lpFileName: PChar): BOOL;
implementation

function memcpy(dest:Pointer;src:Pointer;count:Integer): Integer;
begin
Result := count;
Move(src^,dest^,Result);
end;

// DirectX初始化。返回当前表面获取一张屏幕位图的存储空间大小
function DX_Init: DWORD;
var
hr: HRESULT;
begin
Result := 0;

// 初始化directX
hr := DirectDrawCreate(Nil, lpDD, Nil);
if (FAILED(hr)) then
Exit;

hr := lpDD.SetCooperativeLevel(0, DDSCL_NORMAL);
if (FAILED(hr)) then
Exit;

ZeroMemory(@DDSdesc, sizeof(DDSdesc));
DDSdesc.dwSize := sizeof(DDSdesc);
DDSdesc.dwFlags := DDSD_CAPS;
DDSdesc.ddsCaps.dwCaps := DDSCAPS_PRIMARYSURFACE;
hr := lpDD.CreateSurface(DDSdesc, lpDDSPrime, Nil);
if (FAILED(hr)) then
Exit;

hr := lpDD.GetGDISurface(lpDDSGdi);
if (FAILED(hr)) then
Exit;

ZeroMemory(@DDSdesc, sizeof(DDSdesc));
DDSdesc.dwSize := sizeof(DDSdesc);
DDSdesc.dwFlags := DDSD_ALL;
hr := lpDDSPrime.GetSurfaceDesc(DDSdesc);
if (FAILED(hr)) then
Exit;

// 初始化位图信息
if ((DDSdesc.dwFlags and DDSD_WIDTH) = DDSD_WIDTH) and ((DDSdesc.dwFlags and DDSD_HEIGHT) = DDSD_HEIGHT) then
begin
m_bmrect.left := 0;
m_bmrect.top := 0;
m_bmrect.right := DDSdesc.dwWidth;
m_bmrect.bottom := DDSdesc.dwHeight;
end
else
Exit;

m_bminfo.bmi.bmiHeader.biCompression := BI_RGB;//BI_BITFIELDS;
m_bminfo.bmi.bmiHeader.biBitCount := DDSdesc.ddpfPixelFormat.dwRGBBitCount;

//m_bminfo.truecolour = DDSdesc.ddpfPixelFormat.dwFlags & DDPF_RGB;
if(m_bminfo.bmi.bmiHeader.biBitCount > 8) then
m_bminfo.truecolour := TRUE
else
m_bminfo.truecolour := FALSE;

ZeroMemory(@DDSdesc, sizeof(DDSdesc));
DDSdesc.dwSize := sizeof(DDSdesc);
DDSdesc.dwFlags := DDSD_CAPS or DDSD_HEIGHT or DDSD_WIDTH;
DDSdesc.ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN;
DDSdesc.dwHeight := m_bmrect.bottom - m_bmrect.top;
DDSdesc.dwWidth := m_bmrect.right - m_bmrect.left;
hr := lpDD.CreateSurface(DDSdesc, lpDDSBack, Nil);
if (FAILED(hr)) then
Exit;
//hr = lpDDSPrime->QueryInterface( IID_IDirectDrawSurface3, (LPVOID *)&lpSurf);
//if (FAILED(hr))
// return FALSE;

case (m_bminfo.bmi.bmiHeader.biBitCount) of

32,24:begin
// Update the bitmapinfo header
m_b24 := TRUE;
m_bminfo.bmi.bmiHeader.biSize := sizeof( BITMAPINFOHEADER );
m_bminfo.bmi.bmiHeader.biWidth := 1024;
m_bminfo.bmi.bmiHeader.biHeight := 768;
m_bminfo.bmi.bmiHeader.biPlanes := 1;
// m_bminfo.bmi.bmiHeader.biBitCount := 24;
m_bminfo.bmi.bmiHeader.biCompression := BI_RGB;
m_bminfo.bmi.bmiHeader.biSizeImage :=
abs((m_bminfo.bmi.bmiHeader.biWidth *
m_bminfo.bmi.bmiHeader.biHeight *
m_bminfo.bmi.bmiHeader.biBitCount) div 8);
m_bminfo.bmi.bmiHeader.biXPelsPerMeter := (1024*1000) div 1024;
m_bminfo.bmi.bmiHeader.biYPelsPerMeter := (768*1000) div 768;
m_bminfo.bmi.bmiHeader.biClrUsed := 0;
m_bminfo.bmi.bmiHeader.biClrImportant := 0;
end;
end;


Result := m_bminfo.bmi.bmiHeader.biSizeImage;
end;
// 捕捉屏幕。rect: 区域。scrBuff: 输出缓冲。scrBuffSize: 缓冲区大小
function CaptureScreen(var rect: RECT; scrBuff: PBYTE; scrBuffSize: UINT): LongBool;
var
hr: HRESULT;
surfdesc: TDDSURFACEDESC;
srcbuffpos, destbuffpos: PBYTE;
begin
hr := 0;
Result := False;
hr := lpDDSBack.BltFast(rect.left,rect.top,lpDDSPrime,@rect,DDBLTFAST_NOCOLORKEY or DDBLTFAST_WAIT);
if (FAILED(hr)) then
Exit;


ZeroMemory(@surfdesc, sizeof(surfdesc));
surfdesc.dwSize := sizeof(surfdesc);

hr := lpDDSBack.Lock(@rect, surfdesc, DDLOCK_READONLY or DDLOCK_WAIT or DDLOCK_SURFACEMEMORYPTR (*|DDLOCK_NOSYSLOCK*), 0);
//hr = lpDDSPrime->Lock(&rect, &surfdesc, DDLOCK_READONLY | DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR /*|DDLOCK_NOSYSLOCK*/, NULL);
if (FAILED(hr)) then
Exit;

// copy the data into our buffer

// m_scrinfo.format.bitsPerPixel = 24;
srcbuffpos := PByte( surfdesc.lpSurface);
destbuffpos := scrBuff;

memcpy( destbuffpos, srcbuffpos,m_bminfo.bmi.bmiHeader.biSizeImage);

// unlock the primary surface
//lpDDSPrime->Unlock(surfdesc.lpSurface);
lpDDSBack.Unlock(surfdesc.lpSurface);
Result := TRUE;
end;


function SaveBitmapToFile(bitmap:PBITMAP;lpFileName: PChar;lpBuf: PChar): BOOL;
var
dwWritten: DWORD;
bmfHdr: BITMAPFILEHEADER;
bi: BITMAPINFOHEADER;
fh: THANDLE;
begin
Result := False;
fh := INVALID_HANDLE_VALUE;
bi.biSize := sizeof(BITMAPINFOHEADER);
bi.biWidth:= bitmap^.bmWidth;
bi.biHeight := bitmap^.bmHeight;
bi.biPlanes := 1;
bi.biBitCount :=bitmap^.bmBitsPixel*8;
bi.biCompression := BI_RGB;
bi.biSizeImage := 0;
bi.biXPelsPerMeter := 0;
bi.biYPelsPerMeter := 0;
bi.biClrUsed := 0;
bi.biClrImportant := 0;
fh := CreateFile(lpFileName, GENERIC_WRITE, 0, Nil, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN, 0);
if (fh = INVALID_HANDLE_VALUE) then
Exit;
bmfHdr.bfType := $4D42; // "BM"
bmfHdr.bfSize := sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+bitmap^.bmWidth*bitmap^.bmHeight*bitmap^.bmBitsPixel;
bmfHdr.bfReserved1 := 0;
bmfHdr.bfReserved2 := 0;
bmfHdr.bfOffBits := DWORD(sizeof(BITMAPFILEHEADER)) + DWORD(sizeof(BITMAPINFOHEADER));
WriteFile(fh, PChar(@bmfHdr)^, sizeof(BITMAPFILEHEADER), dwWritten, Nil);
WriteFile(fh, Pchar(@bi)^,sizeof(BITMAPINFOHEADER), dwWritten, Nil);
WriteFile(fh, Pchar(lpBuf)^,bitmap^.bmWidth*bitmap^.bmHeight*bitmap^.bmBitsPixel, dwWritten, NiL);
FlushFileBuffers(fh);
CloseHandle(fh);
Result := true;
end;

function GetBitmapFromScreen(lpFileName: PChar): BOOL;
var
lpBuf: Pchar;
hBitmap,hOld: windows.HBITMAP ;
hDC,hcDC: windows.HDC;
bb: BITMAP;
b: BITMAPINFO;
hp,fh: THANDLE ;
dwX,dwY: DWORD;
begin
fh := INVALID_HANDLE_VALUE;
//***************
dwX := GetSystemMetrics(SM_CXSCREEN);
dwY := GetSystemMetrics(SM_CYSCREEN);
hDC := GetDC(0);
hcDC:=CreateCompatibleDC(hDC);
hBitmap:=CreateCompatibleBitmap(hDC,dwX,dwY);
hOld :=windows.HBITMAP(SelectObject(hcDC,hBitmap));
BitBlt(hcDC,0, 0,dwX,dwY, hDC, 0, 0, SRCCOPY);
bb.bmWidth:=dwX;
bb.bmHeight :=dwY;
bb.bmPlanes := 1;
bb.bmWidthBytes:=bb.bmWidth*3;
bb.bmBitsPixel:=3;
bb.bmType:=0;
b.bmiHeader.biSize := sizeof(BITMAPINFOHEADER);
b.bmiHeader.biWidth:=dwX;
b.bmiHeader.biHeight :=dwY;
b.bmiHeader.biPlanes := 1;
b.bmiHeader.biBitCount :=3*8;
b.bmiHeader.biCompression := BI_RGB;
b.bmiHeader.biSizeImage := 0;
b.bmiHeader.biXPelsPerMeter := 0;
b.bmiHeader.biYPelsPerMeter := 0;
b.bmiHeader.biClrUsed := 0;
b.bmiHeader.biClrImportant := 0;
b.bmiColors[0].rgbBlue:=8;
b.bmiColors[0].rgbGreen:=8;
b.bmiColors[0].rgbRed:=8;
b.bmiColors[0].rgbReserved:=0;
hp:=GetProcessHeap;
lpBuf:=PChar(HeapAlloc(hp,HEAP_ZERO_MEMORY,bb.bmHeight*bb.bmWidth*4));
GetDIBits(hcDC,hBitmap,0,dwY,lpBuf,b,DIB_RGB_COLORS);
SaveBitmapToFile(@bb,lpFileName,lpBuf);
ReleaseDC(0,hDC);
DeleteDC(hcDC);
DeleteObject(hBitmap);
DeleteObject(hOld);
HeapFree(hp,0,lpBuf);
Result := true;
end;
end.
僵哥 2008-05-15
  • 打赏
  • 举报
回复
Mark
Delphi XE2 正式版的破解程序,有效哦。 Delphi XE2 官方完整 delphicbuilder_xe2_win_dl.iso下载地址: http://altd.embarcadero.com/download/radstudio/xe2/delphicbuilder_xe2_win_dl.iso 文件大小: 2.33G MD5: de8b9f897e2ad678643b64898470b707 Delphi Prism XE2 - ISO 1.28G http://altd.embarcadero.com/download/prism/xe2/prism_xe2_win.iso RadPHP XE2 - ISO 343M http://altd.embarcadero.com/download/radphp/xe2/radphp_xe2_win.iso 建议大家用迅雷下载 ************************************** 英巴卡迪诺发布新版RAD Studio XE2开发工具套件 日前,英巴卡迪诺宣布发布新版RAD Studio XE2软件开发工具套件,新版包含了10多年来最深入全面的特性升级。RAD Studio XE2中包含了新版本的DelphiC++Builder、Prism和RadPHP。主要特性包括完整的Delphi 64位Windows支持,通过全新的FireMonkey富商业应用平台支持Mac OSX和iOS,以及通过RadPHP XE2支持安卓web和移动应用开发。 对Delphi XE2和C++Builder XE2来说,一个极其重要的新特性就是FireMonkey,业界第一款用于创建商业软件的原生的能全面利用到CPU和GPU计算能力的富应用平台。使用 FireMonkey,DelphiC++Builder开发人员能开发出视觉绚丽的高清和3D应用程序,并与后台的企业级数据库如Oracle、微软 SQL Server、IBM DB2、Sybase和其他数据库互联互通。FireMonkey应用以原生方式运行在Windows PC和Mac上,可以完全利用到现代GPU的处理能力,以不可置信的细节处理能力和优异的性能表现展现数据和用户界面。FireMonkey还可以使 Delphi XE2用户为移动(iOS)设备创建原生的高清和3D应用程序。 DelphiC++Builder为应用开发提供原生开发方式,而RadPHP XE2则支持web开发和移动设备应用的开发。使用RadPHP XE2,开发人员可以轻松为移动智能电话和平板电脑创建支持触碰和UI优化的web应用。开发人员可以部署他们的移动Web应用为原生移动应用到苹果公司的iOS应用商店和安卓的应用市场。在他们的移动Web应用中,可以直接访问移动设备的硬件,如相机、GPS和重力感应器。 其他新增特性包括: Delphi XE2 和C++Builder XE2 Delphi XE2包括完整的Windows 64位对FireMonkey、编译器、调试器、RTL 和VCL的支持; dbExpress具有新的对InterBase XE, FireBird 2.5, SQL Anywhere 12 和ODBC的连接能力; 新的DataSnap移动连接器,带有原生的平台组件和示例以创建从移动客户端到Delphi DataSnap服务器的连接,支持安卓(Java), iOS (Objective C), 黑莓(Java) 和Windows Phone 7 (C#); 新增和更新的扩展工具,包括FastReport,用于快速设计和生成报表;Documentation Insight,用于Delphi的源代码文档工具; TeeChart、IBX、InstallAware、IP*Works、Aqtime、FinalBuilder、IntraWeb和Indy 的64位版本。 TeeChart、Indy和FinalBuilder还支持Mac平台; C++Builder XE2中还包含了新的代码审计和QA度量工具; LiveBindings使用户能连接任意类型的信息到任意的FireMonkey用户界面和图形对象上。用户可以绑定实时数据到标准的用户界面控件、高清或3D图形元素上,以创建可视化任意类型数据的崭新方式; RadPHP: 集成式为移动优化的Web开发; 部署应用到Web, iOS, 或安卓; 扩展的Zend框架组件集; Embarcadero Prism: 来自RemObjects的全新的.NET Oxygene编译器; 匿名接口实现; FastReport.net

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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