热门标签 | 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;
}


推荐阅读
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文讨论了在使用Timer控件和键盘触发时可能出现的冲突问题,并提供了解决方法。同时还介绍了如何实现一个类似QQ的小图标只出现在右下角而不在状态栏的程序。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
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社区 版权所有