转载自:http://blog.csdn.net/Lsaint/archive/2006/11/05/1367832.aspx
#include <iostream>
#include <windows.h>
using namespace std;
bool SaveBitmapToFile(HDC hDC , HBITMAP hBitmap , LPCTSTR name)
{
//BITMAP是个结构,记录了已调入内存的BMP图象的宽高,颜色等信息以及图象数据
//与系统当前得显示模式,色深有关。
BITMAP bm;
DWORD size;
GetObject(hBitmap,sizeof(bm),(LPBYTE)&bm); // SDK中从HBITMAP获得BITMAP的方法 MFC中用GetBitmap
size = bm.bmWidthBytes*bm.bmHeight;
HGLOBAL hMen = GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT,size);//从堆中分配内存
if(hMen==0)
return false;
LPSTR lpData = (LPSTR)GlobalLock(hMen); // 锁定分配的内存并获得指针
BITMAPINFOHEADER bih; // 位图信息头
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biWidth = bm.bmWidth;
bih.biHeight = bm.bmHeight;
bih.biPlanes = 1;
bih.biBitCount = bm.bmBitsPixel;
bih.biCompression = 0;
bih.biSizeImage = 0;
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
bih.biClrUsed = 0;
bih.biClrImportant = 0;
if(GetDIBits(hDC,hBitmap,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS)==0)
{// 将位图中的数据以bits的形式放入lpData指向的内存单元
GlobalFree(hMen);
return false;
}
BITMAPFILEHEADER bfh; // 位图文件头
bfh.bfType = ((WORD)('M'<<8)|'B');
bfh.bfReserved1 = 0;
bfh.bfReserved2 = 0;
bfh.bfSize = sizeof(bfh)+size;
bfh.bfOffBits = sizeof(bfh);
HANDLE hFile; // MFC中用CFile
DWORD dWrittenNum;
hFile = CreateFile(name,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if( hFile == INVALID_HANDLE_VALUE )
{
cout<<"CREATE FILE FALSE"<<endl;
return false;
}
//SetFilePointer(hFile,0,0,FILE_BEGIN);
//MFC 用WriteHuge()
// BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。
WriteFile(hFile,&bfh,sizeof(bfh),&dWrittenNum,0); // 文件头
//SetFilePointer(hFile,sizeof(bfh),0,FILE_BEGIN);
WriteFile(hFile,&bih,sizeof(bih),&dWrittenNum,0); // 位图信息头
WriteFile(hFile,lpData,size,&dWrittenNum,0); // 图形数据
CloseHandle(hFile);
GlobalFree(hMen); // 打扫
return true;
}
int main()
{
HDC hDC , hmDC;
int nWidth , nHeight;
HBITMAP hBitmap ;
hDC = CreateDC("DISPLAY",0,0,0); // 用DISPLAY参数获得整个屏幕DC
nWidth = GetDeviceCaps(hDC,HORZRES);
nHeight = GetDeviceCaps(hDC,VERTRES);
hmDC = CreateCompatibleDC(hDC); // 内存DC
hBitmap = CreateCompatibleBitmap(hDC,nWidth,nHeight); // 内存位图
SelectObject(hmDC , hBitmap);
BitBlt(hmDC,0,0,nWidth,nHeight,hDC,0,0,SRCCOPY); // 把屏幕DC的内容BitBlt到内存DC
#ifdef STORE_IN_CLIPBOARD
if((OpenClipboard(NULL)!=0)&&(EmptyClipboard()!=0)) // 打开&清空剪贴板
{
SetClipboardData(CF_BITMAP,hBitmap); // 写入剪贴板
CloseClipboard();
}
#else
LPCTSTR name;
name = "C:\\lsaint.bmp"; // 文件保存路径
if(!SaveBitmapToFile(hDC,hBitmap,name))
cout<<"false"<<endl;
#endif
return true;
}
参考:
《编写自己的屏幕捕获木马》 作者:RITATV
《GetBitmapBits和GetDIBits的区别》 作者:笨笨
http://dev.csdn.net/develop/article/12/12484.shtm
http://dev.csdn.net/develop/article/7/7293.shtm