热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

调用Windowsapi窗口截图

分别调用windowsapi函数及CVI自带函数,完成对GRAPH界面的截图界面设计如下图,右侧为graph控件的位置信息,调用API函

分别调用windows api函数及CVI自带函数,完成对GRAPH界面的截图

界面设计如下图,右侧为graph控件的位置信息,调用API函数是完成对于选择窗口的固定位置进行截图,调用CVI自带函数则是针对控件。

}//Windows API截图
int CVICALLBACK printByAPI (int panel, int control, int event,void *callbackData, int eventData1, int eventData2)
{char filePath[500];switch (event){case EVENT_COMMIT:FileSelectPopup ("c:\\Users\\Administrator\\Desktop", "*.bmp", "", "", VAL_SAVE_BUTTON, 0, 0, 1, 1, filePath);SetWaitCursor(1);Delay(0.1);CaptureImage (FindWindowA(NULL,"demo"),filePath);MessagePopup("","");SetWaitCursor(0);break;}return 0;
}/*** GDI 截取指定窗口* * 参数 hwnd 要截屏的窗口句柄* 参数 FilePath 截图存放目录**/
int CaptureImage(HWND hwnd, CHAR *FilePath)
{HDC hdcWindow;HDC hdcMemDC = NULL;HBITMAP hbmScreen = NULL;BITMAP bmpScreen;RECT rcClient;BITMAPFILEHEADER bmfHeader; BITMAPINFOHEADER bi;DWORD dwBmpSize;HANDLE hDIB;CHAR *lpbitmap;HANDLE hFile;DWORD dwSizeofDIB;DWORD dwBytesWritten;hdcWindow = GetWindowDC(hwnd); // 截图目标窗口DC
// hdcWindow = GetDC(hwnd); // 截图DC// 创建兼容内存DChdcMemDC = CreateCompatibleDC(hdcWindow); if(!hdcMemDC){MessagePopup("","CreateCompatibleDC has failed");goto done;}// 获取客户端区域用于计算大小GetClientRect(hwnd, &rcClient);// 设置延展模式SetStretchBltMode(hdcWindow, HALFTONE);// 来源 DC 是整个屏幕而目标 DC 是当前的窗口 (HWND)
/* if(!StretchBlt(hdcWindow, //-----------注释原因:不需要压缩位图,又不截取全屏0,0, rcClient.right, rcClient.bottom, hdcScreen, 0,0,GetSystemMetrics (SM_CXSCREEN),GetSystemMetrics (SM_CYSCREEN),SRCCOPY)){MessagePopup("","StretchBlt has failed");goto done;}
*/ // 通过窗口DC 创建一个兼容位图hbmScreen = CreateCompatibleBitmap(hdcWindow,400, 300//--位图宽高);if(!hbmScreen){MessagePopup("","CreateCompatibleBitmap Failed");goto done;}// 将位图块传送到我们兼容的内存DC中SelectObject(hdcMemDC,hbmScreen);/*---------------------------注释原因:截取软件部分界面,需要设定来源DC的坐标以及目标DC的宽高,保留原代码以观赏 if(!BitBlt(hdcMemDC, // 目的DC0,0, // 目的DC的 x,y 坐标rcClient.right - rcClient.left, rcClient.bottom - rcClient.top, // 目的 DC 的宽高hdcWindow, // 来源DC0,0, // 来源DC的 宽高SRCCOPY)) // 粘贴方式{MessagePopup("","BitBlt has failed");goto done;}*/ if(!BitBlt(hdcMemDC, // 目的DC0,0, // 目的DC的 x,y 坐标400, 300, // 目的 DC 的宽高hdcWindow, // 来源DC50,50+26, // 来源DC的宽高SRCCOPY)) // 粘贴方式{MessagePopup("","BitBlt has failed");goto done;}// 获取位图信息并存放在 bmpScreen 中GetObject(hbmScreen,sizeof(BITMAP),&bmpScreen);bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = bmpScreen.bmWidth; bi.biHeight = bmpScreen.bmHeight; bi.biPlanes = 1; bi.biBitCount = 32; bi.biCompression = BI_RGB; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrUsed = 0; bi.biClrImportant = 0;dwBmpSize = ((bmpScreen.bmWidth * bi.biBitCount + 31) / 32) * 4 * bmpScreen.bmHeight;// 在 32-bit Windows 系统上, GlobalAlloc 和 LocalAlloc 是由 HeapAlloc 封装来的// handle 指向进程默认的堆. 所以开销比 HeapAlloc 要大hDIB = GlobalAlloc(GHND,dwBmpSize); lpbitmap = (char *)GlobalLock(hDIB); // 获取兼容位图的位并且拷贝结果到一个 lpbitmap 中.GetDIBits(hdcWindow, // 设备环境句柄hbmScreen, // 位图句柄0, // 指定检索的第一个扫描线(UINT)bmpScreen.bmHeight, // 指定检索的扫描线数lpbitmap, // 指向用来检索位图数据的缓冲区的指针(BITMAPINFO *)&bi, // 该结构体保存位图的数据格式DIB_RGB_COLORS // 颜色表由红、绿、蓝(RGB)三个直接值构成);// 创建一个文件来保存文件截图hFile = CreateFile(FilePath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);// 将 图片头(headers)的大小, 加上位图的大小来获得整个文件的大小dwSizeofDIB = dwBmpSize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);// 设置 Offset 偏移至位图的位(bitmap bits)实际开始的地方bmfHeader.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER); // 文件大小bmfHeader.bfSize = dwSizeofDIB; // 位图的 bfType 必须是字符串 "BM"bmfHeader.bfType = 0x4D42; //BM dwBytesWritten = 0;WriteFile(hFile, (LPSTR)&bmfHeader, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL);WriteFile(hFile, (LPSTR)&bi, sizeof(BITMAPINFOHEADER), &dwBytesWritten, NULL);WriteFile(hFile, (LPSTR)lpbitmap, dwBmpSize, &dwBytesWritten, NULL);// 解锁堆内存并释放GlobalUnlock(hDIB); GlobalFree(hDIB);// 关闭文件句柄CloseHandle(hFile);// 清理资源
done:DeleteObject(hbmScreen);DeleteObject(hdcMemDC);ReleaseDC(hwnd,hdcWindow);return 0;
}


推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • c# – UWP:BrightnessOverride StartOverride逻辑 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 如何在窗口右下角添加调整大小的手柄
    本文探讨了如何在传统MFC/Win32 API编程中实现类似C# WinForms中的SizeGrip功能,即在窗口的右下角显示一个用于调整窗口大小的手柄。我们将介绍具体的实现方法和相关API。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 在API测试中,我们常常需要通过大量不同的数据集(包括正常和异常情况)来验证同一个接口。如果为每种场景单独编写测试用例,不仅繁琐而且效率低下。采用数据驱动的方式可以有效简化这一过程。本文将详细介绍如何利用CSV文件进行数据驱动的API测试。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • ServiceStack与Swagger的无缝集成指南
    本文详细介绍了如何在ServiceStack项目中集成Swagger,以实现API文档的自动生成和在线测试。通过本指南,您将了解从配置到部署的完整流程,并掌握如何优化API接口的开发和维护。 ... [详细]
author-avatar
zavier
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有