SDK实现截图

这篇博客介绍了如何使用Windows SDK实现屏幕截图并保存为BMP文件。通过创建设备上下文(DC)、内存DC以及兼容位图,然后使用BitBlt函数将屏幕内容复制到内存位图。接着,利用GetBitmapBits和BITMAPINFOHEADER结构将位图数据写入文件。最后,通过CreateFile和WriteFile函数将位图信息写入磁盘。

#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.youkuaiyun.com/develop/article/12/12484.shtm
http://dev.youkuaiyun.com/develop/article/7/7293.shtm

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值