全屏截取(改)

潘小龙,顾时明二人著的”用VC进行屏幕截取编程 “一文中的代码有多处错误,我在yu_hl大虾的大力协助下对其进行修正,以下代码只需复制粘帖就能使用:

文件保存在C盘根目录.

CString dt;

CTime m_CurDT;

m_CurDT=CTime::GetCurrentTime();

dt.Format(“%d-%d-%d “,m_CurDT.GetYear(),m_CurDT.GetMonth(),m_CurDT.GetDay());

dt+=m_CurDT.Format(“%H时%M分%S秒”);

dt+=”.bmp”;

CString bmpname;

bmpname=”c:\\”;

bmpname+=dt;

HDC       hScrDC, hMemDC;

// 屏幕和内存设备描述表

int       nX, nY, nX2, nY2;

// 位图宽度和高度

int       xScrn, yScrn;

// 屏幕分辨率

HBITMAP    hBitm ap, hOldBitmap;

//为屏幕创建设备描述表

hScrDC = CreateDC(“DISPLAY”, NULL, NULL, NULL);

//为屏幕设备描述表创建兼容的内存设备描述表

hMemDC = CreateCompatibleDC(hScrDC);

// 获得屏幕分辨率

xScrn = GetDeviceCaps(hScrDC, HORZRES);

yScrn = GetDeviceCaps(hScrDC, VERTRES);

// 获得全屏坐标

nX = 0;

nY = 0;

nX2 = xScrn;

nY2 = yScrn;

// 创建一个与屏幕设备描述表兼容的位图

hBitmap = CreateCompatibleBitmap(hScrDC, nX2, nY2);

// 把新位图选到内存设备描述表中

hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);

// 把屏幕设备描述表拷贝到内存设备描述表中

BitBlt(hMemDC, 0, 0, nX2, nY2, hScrDC, nX, nY, SRCCOPY);

//得到屏幕位图的句柄

hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);

//清除

DeleteDC(hScrDC);

DeleteDC(hMemDC);

HDC            hDC;

int            iBits;

//当前显示分辨率下每个像素所占字节数

WORD           wBitCount;

//位图中每个像素所占字节数

//定义调色板大小, 位图中像素字节大小 ,

DWORD          dwPaletteSize=0,

dwBmBitsSize,

dwDIBSize, dwWritten;

BITMAP          Bitmap;

//位图属性结构

BITMAPFILEHEADER   bmfHdr;

//位图文件头结构

BITMAPINFOHEADER   bi;

//位图信息头结构

LPBITMAPINFOHEADER lpbi;

//指向位图信息头结构

HANDLE           fh, hDib, hPal,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 <=

wBitCount = 8;

else if (iBits <= 24)

wBitCount = 24;

else

wBitCount = iBits;

//计算调色板大小

if (wBitCount <=

dwPaletteSize = (1 <

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(BITMAPINF OHEADER));

lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);

*lpbi = bi;

// 处理调色板

hPal = GetStockObject(DEFAULT_PALETTE);

if (hPal)

{

hDC = ::GetDC(NULL);

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, hDC);

}

//创建位图文件

fh = CreateFile(bmpname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

// 设置位图文件头

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);

c语言截取屏幕,全屏截取?相关推荐

  1. 截取计算机全屏画面的方法是按,下列用于截取计算机全屏画面的方法不正确的是()。...

    1.使用计算机自带的截图工具: 1)一般情况截图的按键就是"Print Screen SysRq",有些键盘显示为"PrtSC Sys Rq",位置一般就在F1 ...

  2. 截取网页全屏的两种方法

    截取网页全屏的方式 很多时候我们需要对网页的全部内容进行一个截屏,但像微信或者QQ的截图方式只能截取当前页面的内容,下面介绍几种比较简单的截取页面全部内容的方法. 1.谷歌浏览器自带截图功能 2.使用 ...

  3. Vscode快捷键失灵屏幕全屏无法退出

    ...检查下是否切换到了大写输入模式 另外想到了一个差不多的,就是屏幕全屏无法退出,试试F11

  4. 截取计算机全屏画面的方法有,电脑怎么截图全屏 详细方法介绍

    电脑想必大家应该了解了吧!因为电脑现在来说已经非常地普遍了,几乎家家户户都拥有一台电脑.不仅如此,电脑的在其他领域的应用也非常地广泛,电脑有很多的功能,这一点大家在平时也体会到了吧!电脑的功能在各个领 ...

  5. android 旋转屏幕全屏,重新组合活动布局以在旋转屏幕时全屏播放video

    在一个活动中,我嵌入了一个video窗口小部件(与SurfaceView相关联的VideoView或MediaPlayer),当旋转屏幕时,应调整其大小. 此活动用作TabHost中的内容. 我目前的 ...

  6. 副屏幕全屏_电脑 双屏(双屏电脑主屏副屏设置)

    怎么把电脑一变二 双屏显示设置法 随着人们对现实要求越来越高,双屏显示成为用户越来越关注的对象,如抄股做T+0操作,既要关注大盘的走势又要关注股票的走势,就需要不断的切换,很麻烦:在看盘时看看网络电影 ...

  7. UNITY设置屏幕全屏但是周围有黑框的解决方法

    有个项目之前设置全屏的方法是: //获取设置当前屏幕分辩率 Resolution[] resolutions = Screen.resolutions; //设置当前分辨率 Screen.SetRes ...

  8. 副屏幕全屏_电脑屏幕不能全屏显示怎么办 显示器有黑边无法全屏原因及解决方法...

    你有没有遇到过显示器不能全屏显示的情况呢?可能有些遇到过的朋友会说了,这太简单了嘛,一般就是分辨率的问题,调下分辨率就好了,其实,不能全屏显示不一定就是分辨率的问题,对于不是分辨率的问题,那么电脑屏幕 ...

  9. 副屏幕全屏_win7双屏电脑主屏副屏设置|Win7系统如何设置双屏显示?

    随着人们对现实要求越来越高,双屏显示越来越受人们的关注.在日常生活中,我们使用电脑一般只需要一个显示屏,不过有时候做一些工作需要用到多个显示屏.例如抄股做T+0操作,既要关注大盘的走势又要关注股票的走 ...

最新文章

  1. 管理系统状态栏和导航栏(翻译)
  2. 不给欧美科技公司封杀的机会,从换这个国产软件开始!
  3. cpu性能测试软件 国际象棋,国际象棋、科学计算,整机性能测试
  4. 暑期训练日志----2018.8.16
  5. linux svn 客户端安装配置
  6. maxcompute操作_MaxCompute问答整理之9月
  7. 【王道计组笔记】高速缓存器:局部性原理及性能分析
  8. 【转】关于VS2005中不显示解决方案的解决方法
  9. jQuery事件委托
  10. XenApp / XenDesktop 7.6 初体验一   安装, 配置站点和序列号服务器
  11. Java零基础进阶教程分享,人手一套的javase实用视频教程
  12. 小米无线网卡linux驱动下载,Linux下安装MT7601U无线网卡驱动
  13. 应力循环次数60ant_齿轮应力循环次数公式
  14. oracle数据库中文乱码解决办法
  15. VIN码识别/车架号识别独家支持云识别
  16. 云原生2.0时代,保险企业为何要迎智而上?
  17. 网络安全工程师的学习路线,超级简单,收藏这一篇就够了
  18. java和区块链哪个难_java 区块链中设计合理的难度系数
  19. long long类型
  20. 超干货丨你想了解的短视频私域流量玩法都在这

热门文章

  1. MG996R 360°舵机的使用
  2. CloudCompare多个pcd文件的拼接为1个pcd
  3. Jenkins admin 密码忘记解决
  4. sql注入与一句话木马
  5. [SQL]对取出来的数据构造实验组和对照组的方法
  6. QQ短暂支持跳转抖音淘宝又封禁 今天可是最后期限!
  7. 【AI达人创造营三期】Jetson Nano篮球和运动员检测分割的部署
  8. Promise难懂?一篇文章让你轻松驾驭
  9. Slipped Conditions
  10. 浪潮超融合服务器虚拟机管理,浪潮在美发布InCloudRail超融合,这是什么样的节奏?...