为什么我写的区域抓屏保存的程序编译无问题,运行后结果为空??谢谢!

原创 2004年07月13日 22:48:00

以下是源程序~~~


HDC hScrDC, hMemDC;
// 屏幕和内存设备描述表
HBITMAP hBitmap, hOldBitmap;
// 位图句柄
int nX, nY, nX2, nY2;
// 选定区域坐标
int nWidth, nHeight;
// 位图宽度和高度
int xScrn, yScrn;
// 屏幕分辨率

// 确保选定区域不为空矩形
// (IsRectEmpty(lpRect))
//return NULL;
//为屏幕创建设备描述表
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);
// 获得选定区域坐标
nX = 900;
nY = 375;
nX2 = 930;
nY2 = 390;
// 获得屏幕分辨率
xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);
//确保选定区域是可见的
if (nX<0)
nX = 0;
if (nY<0)
nY = 0;
if (nX2>xScrn)
nX2 = xScrn;
if (nY2>yScrn)
nY2 = yScrn;
nWidth = nX2-nX;
nHeight = nY2-nY;
// 创建一个与屏幕设备描述表兼容的位图
hBitmap = CreateCompatibleBitmap
(hScrDC, nWidth, nHeight);
// 把新位图选到内存设备描述表中
hOldBitmap = (HBITMAP) SelectObject(hMemDC, hBitmap);
// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight,
hScrDC, nX, nY, SRCCOPY);
//得到屏幕位图的句柄
hBitmap = (HBITMAP) SelectObject(hMemDC, hOldBitmap);
//清除
DeleteDC(hScrDC);
DeleteDC(hMemDC);

HDC hDC;
WORD wBitCount;
int iBits;
DWORD dwPaletteSize=0,dwBmBitsSize,dwDIBSize,dwWritten;
BITMAP Bitmap;
BITMAPFILEHEADER bmfHdr;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;
HANDLE fh, hDib, hPal=NULL,hOldPal=NULL;
hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
if (iBits<= 1)
wBitCount = 1;
else if (iBits<= 4)
wBitCount = 4;
else if (iBits<= 8)
wBitCount = 8;
else if (iBits<= 24)
wBitCount = 24;
//计算调色板大小
if (wBitCount<= 8)
dwPaletteSize = (1<<wBitCount) *
sizeof(RGBQUAD);
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
dwBmBitsSize = ((Bitmap.bmWidth *wBitCount+31)/32)*4 *Bitmap.bmHeight;
hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC=(HDC)GetDC();
hOldPal = SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);
}
// 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
+dwPaletteSize,
(BITMAPINFO *)lpbi, DIB_RGB_COLORS);
//恢复调色板
if (hOldPal)
{
SelectPalette(hDC,(HPALETTE)hOldPal,TRUE);
RealizePalette(hDC);
ReleaseDC(NULL);
}
//创建位图文件

fh = CreateFile("temp.bmp",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"
dwDIBSize = sizeof(BITMAPFILEHEADER)+ sizeof(BITMAPINFOHEADER) +dwPaletteSize + dwBmBitsSize;bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof
(BITMAPFILEHEADER)
+ (DWORD)sizeof(BITMAPINFOHEADER)
+ dwPaletteSize;
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize,&dwWritten, NULL);
//清除
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);

Python3.6笔记之将程序运行结果输出到文件

新建py文件,在里面写入Python代码,代码的功能是打印10次“Hello!”: 在命令行中运行Python脚本,并将运行结果保存到文件中: (在此之前,要确保设置了环境变量) 首先,来到Py...
  • young2415
  • young2415
  • 2017年08月02日 19:09
  • 1569

关于vs2010运行C程序时,运行结果窗口一闪而过的问题

用VC++6.0和VS中的C++编程,今天正常安装好后,编写一个正确的程序,可运行的时候,DOS窗口一晃而过,也算是正常编译了,但我不懂的是它为什么消失得这么快? 会出现dos界面是因为你程序中可能...
  • u014021801
  • u014021801
  • 2014年11月05日 16:46
  • 3865

vc++指定区域截屏

int CCaptureDeskDlg::SaveBitmapToFile(HBITMAP hBitmap, LPCWSTR lpFileName) //hBitmap 为刚才...
  • lcalqf
  • lcalqf
  • 2016年09月10日 13:49
  • 561

java面试题1--继承--看程序写结果

题1:看程序写结果:     A:成员变量 就近原则     B:this和super的问题       this访问本类的成员       super访问父类的成员     C:子类构造...
  • u014726937
  • u014726937
  • 2016年07月27日 22:08
  • 321

Fiddler抓包9-保存会话(save)

Fiddler抓包9-保存会话(save) 前言 为什么要保存会话呢?举个很简单的场景,你在上海测试某个功能接口的时候,发现了一个BUG,而开发这个接口的开发人员是北京的一家合作公...
  • Foreverlemon
  • Foreverlemon
  • 2017年05月17日 22:31
  • 465

在Java中,如何把一个程序的结果需要保存起来,供下一个程序使用的方式

1:最方便的、永久保存的数据库方式。 一个程序执行完后,把结果存入到数据库中,下一个程序启动初始化后再去数据库中查找是否已经存在相应的信息。这种方式的好处:存储方便,只需借助数据库的存储即可,永久保...
  • liufunan
  • liufunan
  • 2016年05月03日 11:16
  • 1510

Scala程序编译运行

本文详细介绍了Scala程序编译、打包、运行的全过程,以及各种方式的利弊分析...
  • u010376788
  • u010376788
  • 2015年07月17日 16:58
  • 7293

VC/MFC 使用GDI实现抓屏

抓屏的实现            最近研究了抓屏的功能,抓屏过后把图片保持成JPG图像格式,百度、Google了好一阵终于有点明白了,特此在这里写下来和大家一起分享。       微软规...
  • sanshao1314
  • sanshao1314
  • 2013年03月21日 23:01
  • 1141

定义的数组过大,程序运行结果为空?

总结:程序设计过程中,较大的数组定义在外部或是动态分配 问题描述:/*C语言中,把变量定义在主函数之外和定义在主函数之内有什么区别?*/ int i = 3; int main() { in...
  • wangjun_huster
  • wangjun_huster
  • 2017年03月26日 22:45
  • 365

用记事本运行一个java程序

一直对eclipse和jdk的关系没搞清楚,不知道为什么安装eclipse以后要安装jdk    学习了深入理解计算机系统以后,稍微明白一点,我们程序员写的高级程序计算机是 识别不出来的。那么需要由编...
  • linxizi0622
  • linxizi0622
  • 2016年10月24日 13:50
  • 880
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为什么我写的区域抓屏保存的程序编译无问题,运行后结果为空??谢谢!
举报原因:
原因补充:

(最多只允许输入30个字)