捕捉屏幕并保存位图文件

原创 2004年10月26日 19:04:00
 
    一百年前的示例代码,贴出来算权当收藏Emotion
////////////////////////////////////////////////////////////////////////////////////////////////////
// 预处理
#include

// 每行数据对齐起到四个字节,下面的定义仅仅用于 24 位色 DIB
#define _WidthPitch(w) ((w + w + w + 3) & 0xFFFFFFFC)
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
// 函数声明
HBITMAP WINAPI CaptureScreen(LPCRECT prtRect);
BOOL WINAPI SaveBitmap(HBITMAP hBitmap, LPCSTR ptzFileName);
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
// 程序入口,使用自定义入口将生成非常小的 PE 文件,仅有 3K
#ifndef _DEBUG
#pragma comment(linker, "/ENTRY:EntryPoint")
VOID WINAPI EntryPoint()
{
ExitProcess(WinMain(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOWNORMAL));
}
#endif // _DEBUG
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
// 主函数
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pszCmdLine, INT iCmdShow)
{
HBITMAP hBitmap;

hBitmap = CaptureScreen(NULL);
if (hBitmap)
{
if (SaveBitmap(hBitmap, "C://CaptureScreen.bmp"))
{
DeleteObject(hBitmap);

MessageBox(NULL, "屏幕图像保存在 C://CaptureScreen.bmp", "完成", MB_ICONINFORMATION);

return 0;
}

DeleteObject(hBitmap);
}

MessageBox(NULL, "不知道出了什么错误:)……", "错误", MB_ICONSTOP);

return -1;
}
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
// 捕捉窗口窗口矩形区域。prtRect 为要捕捉的矩形区域,如果为 NULL,则捕捉整个窗口
HBITMAP WINAPI CaptureScreen(LPCRECT prtRect)
{
INT x;
INT y;
HDC hdcSrc;
HDC hdcMem;
INT iWidth;
INT iHeight;
HBITMAP hbmpTemp;
HBITMAP hbmpReturn;

// 创建屏幕设备场景
hdcSrc = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);

// 设置捕捉矩形
if (prtRect == NULL)
{
x = 0;
y = 0;
iWidth = GetDeviceCaps(hdcSrc, HORZRES);
iHeight = GetDeviceCaps(hdcSrc, VERTRES);
}
else
{
x = prtRect->left;
y = prtRect->top;
iWidth = prtRect->right - prtRect->left;
iHeight = prtRect->bottom - prtRect->top;
}

// 创建内存兼容设备场景
hdcMem = CreateCompatibleDC(hdcSrc);
hbmpReturn = CreateCompatibleBitmap(hdcSrc, iWidth, iHeight);

// 传送位图
hbmpTemp = (HBITMAP) SelectObject(hdcMem, hbmpReturn);
BitBlt(hdcMem, 0, 0,  iWidth, iHeight, hdcSrc, x, y, SRCCOPY);
SelectObject(hdcMem, hbmpTemp);

// 删除设备场景
DeleteDC(hdcMem);
DeleteDC(hdcSrc);

return hbmpReturn;
}
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
// 保存屏幕兼容位图为 24 位色位图文件
BOOL WINAPI SaveBitmap(HBITMAP hBitmap, LPCSTR ptzFileName)
{
HDC hDC;
DWORD dwSize;
BOOL bReturn;
LPBYTE pBits;
HANDLE hFile;
BITMAP bmBitmap;
BITMAPFILEHEADER bfhFile;
BITMAPINFOHEADER bihInfo;

// 返回值初始化为 FALSE
bReturn = FALSE;

// 取得屏幕兼容位图的对象信息
if (GetObject(hBitmap, sizeof(BITMAP), &bmBitmap))
{
// 设置 BITMAPINFOHEADER 结构
bihInfo.biSize = sizeof(BITMAPINFOHEADER);
bihInfo.biWidth = bmBitmap.bmWidth;
bihInfo.biHeight = bmBitmap.bmHeight;
bihInfo.biPlanes = 1;
bihInfo.biBitCount = 24;
bihInfo.biCompression = BI_RGB;
bihInfo.biSizeImage =  _WidthPitch(bmBitmap.bmWidth) * bmBitmap.bmHeight;
bihInfo.biXPelsPerMeter = 0;
bihInfo.biYPelsPerMeter = 0;
bihInfo.biClrUsed = 0;
bihInfo.biClrImportant = 0;

// 设置 BITMAPFILEHEADER 结构
bfhFile.bfType = 0x4D42; // "BM"
bfhFile.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + bihInfo.biSizeImage;
bfhFile.bfReserved1 = 0;
bfhFile.bfReserved2 = 0;
bfhFile.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

// 分配内存
pBits = (LPBYTE) HeapAlloc(GetProcessHeap(), 0, bihInfo.biSizeImage);
if (pBits)
{
// 获取屏幕设备场景
hDC = CreateIC("DISPLAY", NULL, NULL, NULL);

// 获取 DIB 数据
if (GetDIBits(hDC, hBitmap, 0, bmBitmap.bmHeight,
pBits, (LPBITMAPINFO) &bihInfo, DIB_RGB_COLORS))
{
// 创建文件
hFile = CreateFile(ptzFileName, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
// 写入 BITMAPFILEHEADER  信息
bReturn = WriteFile(hFile, &bfhFile, sizeof(BITMAPFILEHEADER), &dwSize, 0);
if (bReturn)
{
// 写入 BITMAPINFOHEADER 信息
bReturn = WriteFile(hFile, &bihInfo, sizeof(BITMAPINFOHEADER), &dwSize, 0);
if (bReturn)
{
// 写入 DIB 数据
bReturn = WriteFile(hFile, pBits, bihInfo.biSizeImage, &dwSize, 0);
}
}

// 关闭文件句柄
CloseHandle(hFile);
}
}

// 删除设备场景,释放内存
DeleteDC(hDC);
HeapFree(GetProcessHeap(), 0, (LPVOID) pBits);
}
}

return bReturn;
}
////////////////////////////////////////////////////////////////////////////////////////////////////

捕捉屏幕并保存位图文件 -转自YONSM

[function doZoom(size){ document.getElementById(zoom).style.fontSize=size+px} 字体:大 中 小] 2004年10月20日...
  • jarodlau
  • jarodlau
  • 2005年04月08日 00:26
  • 652

如何在VB中执行屏幕捕捉并保存到指定位置

在很多情况下捕捉屏幕上的画面是非常有用的,比如:记录电脑失灵或者写技术手册和软件文档。你可以运用两种方法从VB程序中捕捉屏幕图片。一种是复杂的方法,包含windows的设备描述表和API组件,还有一种...
  • changleqy
  • changleqy
  • 2007年08月08日 15:32
  • 1884

android屏幕捕捉

使用MediaprojectionManager 的方法来进行屏幕捕捉,VirtualDisplay来展示捕捉的屏幕截图,关键代码为: 实例化视频放映管理器 projectionManager = ...
  • csdn_blog_lcl
  • csdn_blog_lcl
  • 2016年09月26日 21:36
  • 443

截取位图中的某一部分,并保存为另一位图

  截取位图中的某一部分,并保存为另一位图 ReadBitmap()读取某一张位图;ClipBitmap()获取位图中的某一部分;SaveBMP()保存位图HBITMAP ReadBitmap(LPC...
  • ding_net
  • ding_net
  • 2011年06月22日 00:55
  • 585

VC实现屏幕捕捉

 /*以前写过一个在C#下面的屏幕捕捉程序,现在用C++在VC下实现.个体步骤:1.获取桌面窗口指针,并建立一个与之兼容的设备环境2.创建一个与桌面窗口指针相兼容的内存位图3.以位图形式将屏幕图像复制...
  • blessyou312
  • blessyou312
  • 2007年09月14日 11:22
  • 817

如何截取屏幕并生成GIF动画

前面在写关于VPython的文章的时候,我考虑了一下如何把VPython的动作记录下来,存为GIF动画再放到博客上来.     首先,在维基百科找到关于GIF文件格式的描述, 由于该部分占用篇幅太多...
  • hackjames
  • hackjames
  • 2011年11月09日 09:52
  • 2963

第十课,BMP文件与像素操作

转自:http://www.programfan.com/club/post-227694.html今天我们先简单介绍Windows中常用的BMP文件格式,然后讲OpenGL的像素操作。虽然看起来内容...
  • fengerfafa
  • fengerfafa
  • 2008年01月21日 13:50
  • 1883

C++截图并保存为文件

调用WindowsApi,使用Com组件,我也是借鉴加修改的,以后当成工具调用就可以了,写了部分注释,就不一句句讲解了。         GetThumbImage()是用来调用截图的ScreenCa...
  • jiaoo
  • jiaoo
  • 2017年02月13日 16:10
  • 411

屏幕抓图并保存

常常需要将屏幕图像或程序图形保存成图像格式,对于不太熟悉设备上下文和DDB、DIB的新手来说,无疑是一个难题,下面给出简单实现抓图功能的两个函数。函数1: CopyScreenToBitmap //将...
  • sssssxxxxx921
  • sssssxxxxx921
  • 2007年10月02日 16:36
  • 392

C#制作屏幕捕捉程序

随着微软.Net战略的进一步深入,各种新的技术、概念可谓层出不穷,特别是C#语言的推出,在业界产生了重大影响。C#是一门高效的语言,它既有VB的RAD特性,又不乏C++语言的高效性。最重要的它是基于....
  • hongfly126
  • hongfly126
  • 2007年06月20日 11:09
  • 955
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:捕捉屏幕并保存位图文件
举报原因:
原因补充:

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