C++实现屏幕截图功能

本文实例为大家分享了C++实现全屏截图功能的具体代码,供大家参考,具体内容如下

最近维护的项目,在某些情况下,光有日志还不行,于是添加了截图功能,特定情况下,会自动截图,辅助分析,从而改进程序。以下是截图实现代码。

void CDemoDlg::ScreenShot(void)
{
 CWnd *pDesktop = GetDesktopWindow();
 CDC *pdeskdc = pDesktop->GetDC();
 CRect re;
 //获取窗口的大小
 pDesktop->GetClientRect(&re);
 CBitmap bmp;
 bmp.CreateCompatibleBitmap(pdeskdc, re.Width(), re.Height());
 //创建一个兼容的内存画板
 CDC memorydc;
 memorydc.CreateCompatibleDC(pdeskdc);
 //选中画笔
 CBitmap *pold = memorydc.SelectObject(&bmp);
 //绘制图像
 memorydc.BitBlt(0, 0, re.Width(), re.Height(), pdeskdc, 0, 0, SRCCOPY);
 //获取鼠标位置,然后添加鼠标图像
 CPoint po;
 GetCursorPos(&po);
 HICON hinco = (HICON)GetCursor();
 memorydc.DrawIcon(po.x - 10, po.y - 10, hinco);
 //选中原来的画笔
 memorydc.SelectObject(pold);
 BITMAP bit;
 bmp.GetBitmap(&bit);
 //定义 图像大小(单位:byte)
 DWORD size = bit.bmWidthBytes * bit.bmHeight;
 LPSTR lpdata = (LPSTR)GlobalAlloc(GPTR, size);
 //后面是创建一个bmp文件的必须文件头
 BITMAPINFOHEADER pbitinfo;
 pbitinfo.biBitCount = 24;
 pbitinfo.biClrImportant = 0;
 pbitinfo.biCompression = BI_RGB;
 pbitinfo.biHeight = bit.bmHeight;
 pbitinfo.biPlanes = 1;
 pbitinfo.biSize = sizeof(BITMAPINFOHEADER);
 pbitinfo.biSizeImage = size;
 pbitinfo.biWidth = bit.bmWidth;
 pbitinfo.biXPelsPerMeter = 0;
 pbitinfo.biYPelsPerMeter = 0;
 GetDIBits(pdeskdc->m_hDC, bmp, 0, pbitinfo.biHeight, lpdata, (BITMAPINFO*)
  &pbitinfo, DIB_RGB_COLORS);
 BITMAPFILEHEADER bfh;
 bfh.bfReserved1 = bfh.bfReserved2 = 0;
 bfh.bfType = ((WORD)('M' << 8) | 'B');
 bfh.bfSize = size + 54;
 bfh.bfOffBits = 54;
 //写入文件
 CFile file;
 CString strFileName(GetAppPathW().c_str());
 strFileName += _T("ScreenShot\\");
 CreateDirectory((LPCTSTR)strFileName, NULL);
 CTime t = CTime::GetCurrentTime();
 CString tt = t.Format("%Y-%m-%d_%H-%M-%S");
 strFileName += tt;
 strFileName += _T(".bmp");
 if (file.Open((LPCTSTR)strFileName, CFile::modeCreate | CFile::modeWrite))
 {
  file.Write(&bfh, sizeof(BITMAPFILEHEADER));
  file.Write(&pbitinfo, sizeof(BITMAPINFOHEADER));
  file.Write(lpdata, size);
  file.Close();
 }
 GlobalFree(lpdata);
}

代码注释详尽,我就不多说啥了,保存为bmp无损文件,体积会有些大,朋友可以转化为png格式保存哦。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • VC++基于Dx实现的截图程序示例代码
  • C++实现屏幕截图功能
(0)

相关推荐

  • C++实现屏幕截图

    上回分享了一个全屏截图的代码,保存为BMP,参考:C++实现屏幕截图(全屏截图) 实际使用的过程中我发现截图文件实在大,无奈又整成了PNG截图,现在分享出来. MakePNG.h //MakePNG.h #pragma once #include <GdiPlus.h> using namespace Gdiplus; #pragma comment(lib,"GdiPlus.lib") class CMakePNG { public: CMakePNG(void); ~C

  • VC++基于Dx实现的截图程序示例代码

    本文所述的程序示例为VC++图象特效的截图示例,需要DirectX 3.0以上版,代码中的GetScreen函数是本截图程序的关键.运行这个程序可用Esc键结束.代码中需要ddutil.h与ddutil.cpp文件,请自行下载添加.关于InitDDraw()函数,功能是初始化DirectDraw环境,创建换页链(主页面,一个后台缓冲区),以及创建一个定时器. 具体的功能代码如下: #include <windows.h> #include <windowsx.h> #include

  • C++实现屏幕截图功能

    本文实例为大家分享了C++实现全屏截图功能的具体代码,供大家参考,具体内容如下 最近维护的项目,在某些情况下,光有日志还不行,于是添加了截图功能,特定情况下,会自动截图,辅助分析,从而改进程序.以下是截图实现代码. void CDemoDlg::ScreenShot(void) { CWnd *pDesktop = GetDesktopWindow(); CDC *pdeskdc = pDesktop->GetDC(); CRect re; //获取窗口的大小 pDesktop->GetCli

  • 关于Selenium的UI自动化测试屏幕截图功能实例代码

    UI自动化测试执行过程中,当遇到检查失败的情况,往往会发现打印的log并不能有效地帮助我们定位问题.我们需要失败时刻的屏幕截图来重现当时的失败场景,进而排查出错原因. 基于这种需求可以使用Selenium的屏幕截图功能. 实现代码如下: import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.time.DateU

  • Android 5.0及以上编程实现屏幕截图功能的方法

    本文实例讲述了Android 5.0及以上编程实现屏幕截图功能的方法.分享给大家供大家参考,具体如下: 在Android 5.0,API 21 之前想要截图系统屏幕必须Root才能完成,5.0之后开放了接口,下面看我们是怎么实现的. 一. 涉及到的相关类 1. MediaProjectionManager 官方原话: Manages the retrieval of certain types of {@link MediaProjection} tokens. 这个类通过 Context#ge

  • Linux下截屏并编辑的最佳工具

    当我的主力操作系统从 Windows 转换到 Ubuntu 的时候,首要考虑的就是屏幕截图工具的可用性.尽管使用默认的键盘快捷键也可以获取屏幕截图,但如果使用屏幕截图工具,可以更方便地对屏幕截图进行编辑. 本文将会介绍在不适用第三方工具的情况下,如何通过系统自带的方法和工具获取屏幕截图,另外还会介绍一些可用于 Linux 的最佳截图工具. 方法 1:在 Linux 中截图的默认方式 你想要截取整个屏幕?屏幕中的某个区域?某个特定的窗口? 如果只需要获取一张屏幕截图,不对其进行编辑的话,那么键盘的

  • python基于Selenium的web自动化框架

    1 什么是selenium Selenium 是一个基于浏览器的自动化工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案.Selenium主要包括三部分:Selenium IDE.Selenium WebDriver 和Selenium Grid: Selenium IDE:Firefox的一个扩展,它可以进行录制回放,并可以把录制的操作以多种语言(例如java,python等)的形式导出成测试用例. Selenium WebDriver:提供Web自动化所需的API,主要用作浏览

  • 如何用Python从桌面读取二维码信息详解

    目录 前言 安装 条码 SDK 从屏幕扫描二维码 添加用于剪切事件的按钮 创建自定义 Qt 小部件 拍摄屏幕图像 隐藏和显示应用程序窗口 测试屏幕二维码阅读器 总结 前言 日常生活中,我们通常会拿出智能手机扫描二维码.但是当我们在电脑上工作时,手机可能不是扫描网页上出现的二维码的最佳选择. 原因一:从显示器屏幕上拍摄的照片具有干扰 QR 码识别的莫尔图案. 原因二:你可能希望直接在 PC 上使用解码后的信息,例如用于打开网站的 URL. 本文将使用 Python 实现一个简单的工具,以方便在桌面

  • C++实现功能齐全的屏幕截图示例(附demo)

    目录 1.概述 2.屏幕截图的主要功能点 3.屏幕截图的主体实现思路 3.1.截图主窗口全屏置顶 3.2.桌面灰化 3.3.窗口自动套索 3.4.区域放大 3.5.截取区域的选择 3.5.截图工具条 3.6.矩形等图元的绘制 4.桌面灰化的实现细节 5.窗口自动套索实现 6.区域放大实现 7.截取区域的选择 8.矩形等图元的绘制 9.截图窗口的绘制机制 10.截图退出类型的详细设计 11.创建位图时将CreateCompatibleBitmap替换成CreateDIBSection 12.最后

  • java代码实现截图功能(屏幕截图)

    复制代码 代码如下: import java.awt.Dimension;import java.awt.Rectangle;import java.awt.Robot;import java.awt.Toolkit;import java.awt.image.BufferedImage;import java.io.File; import javax.imageio.ImageIO; /*****************************************************

  • 分享js粘帖屏幕截图到web页面插件screenshot-paste

    在很多场合下,我们可能有这样的需求:提供个屏幕截图上传到系统,作为一个凭证.传统的操作方式是:屏幕截图,保存文件到本地,在web页面上选择本地文件并上传,这里至少需要三步.有没有可能直接将截图粘帖到web页面上,然后上传?答案是:可以的.这就是本文要介绍的内容了. 由于我的项目有上传屏幕截图这样的需求,为了用户体验更佳,减少操作步骤,我在网上搜了一遍之后,找到了一些眉目.为了便于复用和共享,我又对该功能做了一些封装,于是便有了这个插件 screenshot-paste.运行效果如下图: 插件调用

随机推荐