读书人

大神!半夜等

发布时间: 2013-02-17 10:44:47 作者: rapoo

大神求助!!!半夜等
这是一段DX代码!!是保存为一个BMP文件!
我不需要保存文件。只需要将它存放在Tbitmap的变量中。或者直接返回tbitmap。。帮忙修改修改呗。。在线等



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,fh,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;
delphi
[解决办法]
我又检查一遍,是我看得不仔细,抱歉。稍微调整一下:

前面的两行还需要保留:
hDC := GetDC(0);
hcDC:=CreateCompatibleDC(hDC);

虽然创建 TBitmap 不需要 hDC,但后面的处理还需要,所以这两行需要保留。这样,后面的代码只需要删除保存文件和 DeleteObject(hBitmap)这一行就行了。我重写了你的函数,试过,能抓屏。把我修改后的代码都给你贴上吧:

function GetBitmapFromScreen: TBitmap;
var
lpBuf: Pchar;
hBitmap,hOld: windows.HBITMAP ;
hDC,hcDC: windows.HDC;
bb: BITMAP;
b: BITMAPINFO;
hp,fh: THANDLE ;
dwX,dwY: DWORD;
dBitmap: TBitmap;
begin
fh := INVALID_HANDLE_VALUE;
//***************
dwX := GetSystemMetrics(SM_CXSCREEN);
dwY := GetSystemMetrics(SM_CYSCREEN);

hDC := GetDC(0);
hcDC:=CreateCompatibleDC(hDC);

hBitmap:=CreateCompatibleBitmap(hDC,dwX,dwY);
dBitmap := TBitmap.Create;
dBitmap.Width := dwX;
dBitmap.Height := dwY;
hBitmap := dBitmap.Handle;



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,fh,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 := dBitmap;
end;

读书人网 >.NET

热点推荐