windows API 实现截图
參考:http://bbs.csdn.net/topics/330154355
#include "stdio.h"
#include "windows.h"
/************************************************************************/
/* hBitmap 为刚才的屏幕位图句柄
/* lpFileName 为须要保存的位图文件名称
/************************************************************************/
int SaveBitmapToFile(HBITMAP hBitmap,LPSTR lpFileName)
{ HDC hDC; //设备描写叙述表int iBits;//当前显示分辨率下每一个像素所占字节数WORD wBitCount;//位图中每一个像素所占字节数 DWORD dwPaletteSize=0;//定义调色板大小DWORD dwBmBitsSize;//位图中像素字节大小DWORD dwDIBSize;// 位图文件大小DWORD dwWritten;//写入文件字节数BITMAP Bitmap;//位图结构BITMAPFILEHEADER bmfHdr; //位图属性结构 BITMAPINFOHEADER bi; //位图文件头结构LPBITMAPINFOHEADER lpbi; //位图信息头结构 指向位图信息头结构HANDLE fh;//定义文件句柄HANDLE hDib;//分配内存句柄HANDLE hPal;//分配内存句柄HANDLE 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;else if (iBits<=32)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);if (lpbi==NULL){return 0;}*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,(LPBITMAPINFO)lpbi, DIB_RGB_COLORS); //恢复调色板 if (hOldPal) { SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); RealizePalette(hDC); ReleaseDC(NULL, hDC); } //创建位图文件 fh = CreateFile(lpFileName, 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);return 1;
}HBITMAP GetCaptureBmp()
{HDC hDC; HDC MemDC; BYTE* Data; HBITMAP hBmp; BITMAPINFO bi; memset(&bi, 0, sizeof(bi)); bi.bmiHeader.biSize = sizeof(BITMAPINFO);bi.bmiHeader.biWidth = GetSystemMetrics(SM_CXSCREEN); bi.bmiHeader.biHeight = GetSystemMetrics(SM_CYSCREEN); bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 24; hDC = GetDC(NULL); MemDC = CreateCompatibleDC(hDC); hBmp = CreateDIBSection(MemDC, &bi, DIB_RGB_COLORS, (void**)&Data, NULL, 0); SelectObject(MemDC, hBmp); BitBlt(MemDC, 0, 0, bi.bmiHeader.biWidth, bi.bmiHeader.biHeight,hDC, 0, 0, SRCCOPY); ReleaseDC(NULL, hDC); DeleteDC(MemDC); return hBmp;
} void main()
{HBITMAP hBmp; hBmp = GetCaptureBmp(); SaveBitmapToFile(hBmp,"c:\\11.bmp");
}
windows API 实现截图相关推荐
- 调用Windows api 窗口截图
分别调用windows api函数及CVI自带函数,完成对GRAPH界面的截图 界面设计如下图,右侧为graph控件的位置信息,调用API函数是完成对于选择窗口的固定位置进行截图,调用CVI自带函数则 ...
- python windows api截图_Python调用windows API实现屏幕截图
Python调用windows API实现屏幕截图 好处是 灵活 速度快 缺点是: 写法繁琐 不跨平台 import time import win32gui, win32ui, win32con, ...
- python怎么保存到桌面_python3应用windows api对后台程序窗口及桌面截图并保存的方法...
python的版本及依赖的库的安装 #版本python 3.7.1 pip install pywin32==224 pip install numpy==1.15.3 pip install ope ...
- python3应用windows api对后台程序窗口及桌面截图并保存
目录 python的版本及依赖的库的安装 对后台窗口截图 对桌面截图 python的版本及依赖的库的安装 #版本python 3.7.1 pip install pywin32==224 pip in ...
- pythonenumapi_Python调用windows API实现屏幕截图
Python调用windows API实现屏幕截图 好处是 灵活 速度快 缺点是: 写法繁琐 不跨平台 import time import win32gui, win32ui, win32con, ...
- 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程
标 题: [原创]使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程. 作 者: shayi 时 间: 2015-02-12,05:19:54 链 ...
- C/C++中Windows API 简单的(Callback)回调机制
首先来说说什么是调用和回调 当一个程序调用windows API时的过程称为Call 当windows API调用程序里面的函数时这称之为Callback 下面举一个简单的例子来说明回调的用途 编写一 ...
- 案例一: 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程。 首先用文本编辑器写一个C++源程序名为StackFrame.cpp ,代码如下:
案例一: 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程. 首先用文本编辑器写一个C++源程序名为StackFrame.cpp ,代码如下: 1 ...
- C#通过Windows API捕获窗,获取窗口文本(FindWindow、GetWindowText),附录:Windows窗口消息大全、Windows API大全
文章目录 一.前言 二.使用Spy++工具分析窗口 三.C#通过Windows API捕获窗口,获取窗口文本 四.附录:Windows窗口消息 五.Windows API大全 1.API之网络函数 2 ...
最新文章
- 修改CentOS yum源
- 美多商城之项目准备-工程创建和配置
- 【加州理工】什么是模仿学习(Imitation Learning(模仿学习), 这62页ppt带你了解进展...
- java 打印日志log_java如何LOG打印出日志信息
- 自动化监控--zabbix中的邮件报警通知详解
- 2、C#基础 - Visual Studio 的版本选择和下载
- ubuntu14.04配置caffe
- 工作的时候用到spring返回xml view查到此文章亲测可用
- 近300个 Windows 10 可执行文件易受 DLL 劫持攻击
- 使用kubeadm安装部署k8s
- 教你如何发布自己的网站
- 通信:5G孕育上游投资空间
- 墙绘装饰设计公司网站织梦模板免费下载
- 天蓝-skyblue迁移到博客园
- paper:Attention Is All You Need(模型篇)
- 2022-2028年中国三元锂电池行业市场运营格局及前景战略分析报告
- 分布式文件系统FastDFS集群搭建
- wlan从入门到精通第四期WLAN常用概念
- element ui 实现表格分页
- 【爱的瓶子xp主题】
热门文章
- C语言计算月份天数if,阅读下列说明,回答问题1至问题3。【说明】 以下代码由C语言书写,能根据指定的年、月计算当月所含天数 - 赏学吧...
- KFold、StratifiedKFold、GroupKFold的区别
- 动效引擎_汇众教育 | 高级引擎视效包装设计
- 使用tab键分割的文章能快速转换成表格。( )_Word 多级列表编号方法总结(一)——快速入门
- php7 安装zendopcache,安装PHP加速插件ZendOpcache
- icloud连接服务器时出现问题_ios13 ipad/iphone与windows 连接传输文件显示连接服务器用户或密码无效解决方法...
- vue学习:vue中data和return data的区别
- 笔记-信息系统开发基础-面向对象基本概念-对象和类
- 笔记-信息系统开发基础-CMMI组织能力成熟度模型-连续式和阶梯式的分组
- 项目管理如何调动员工的积极性?