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

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

//CVI自带工具截图
int CVICALLBACK printByCVI (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);SaveCtrlDisplayToFile (panelHandle, PANEL_GRAPH, 0, -1, -1, filePath);MessagePopup("","");SetWaitCursor(0);break;}return 0;
}//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;
}

调用Windows api 窗口截图相关推荐

  1. python windows api截图_Python调用windows API实现屏幕截图

    Python调用windows API实现屏幕截图 好处是 灵活 速度快 缺点是: 写法繁琐 不跨平台 import time import win32gui, win32ui, win32con, ...

  2. 用C#调用Windows API向指定窗口发送按键消息

    为什么80%的码农都做不了架构师?>>>    用C#调用Windows API向指定窗口发送 一.调用Windows API. C#下调用Windows API方法如下: 1.引入 ...

  3. 用C#调用Windows API向指定窗口发送按键消息(转载)

    用C#调用Windows API向指定窗口发送按键消息 z 用C#调用Windows API向指定窗口发送 一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空 ...

  4. pythonenumapi_Python调用windows API实现屏幕截图

    Python调用windows API实现屏幕截图 好处是 灵活 速度快 缺点是: 写法繁琐 不跨平台 import time import win32gui, win32ui, win32con, ...

  5. 善于 调用Windows API

    前一段时间看见别人做的一个自动填写信息并且点击登录的程序,觉得很有意思. 其实就是在程序中调用Windows的API,那么如何调用,下面就做个简单的介绍. 写的简单粗暴, 不喜轻喷. 0.首先引入名称 ...

  6. 在C#中调用windows API函数

    Api函数是构筑Windws应用程序的基石,每一种Windows应用程序开发工具,它提供的底层函数都间接或直接地调用了Windows API函数,同时为了实现功能扩展,一般也都提供了调用Windows ...

  7. delphi调用windows api

    在Delphi中调用Windows API 函数十分方便,只需在单元的uses段加入Windows 单元名即可(对于由Delphi自动创建的单元,该项工作已经完成).单元Windows.pas 已经由 ...

  8. python电脑怎么打开任务管理器_利用Python调用Windows API,实现任务管理器功能

    任务管理器具体功能有: 1. 列出系统当前所有进程. 2. 列出隶属于该进程的所有线程. 3. 如果进程有窗口,可以显示和隐藏窗口. 4. 强行结束指定进程. 通过Python调用Windows AP ...

  9. 利用Python调用Windows API,实现任务管理器功能

    任务管理器具体功能有: 1. 列出系统当前所有进程. 2. 列出隶属于该进程的所有线程. 3. 如果进程有窗口,可以显示和隐藏窗口. 4. 强行结束指定进程. 通过Python调用Windows AP ...

最新文章

  1. java正则表示判断。是否以某个关键字结尾的
  2. IDA Pro7.0使用技巧总结使用
  3. Android Studio快捷键快速入门
  4. HLG 1357 Leyni,罗莉和怪叔叔
  5. caffe使用训练好的模型对自己的一张图片进行测试
  6. 16QAM调制的仿真及其Python实现的代码(超级详细)
  7. 鸿蒙HMS大势渐成,P40系列开启华为终端新征程
  8. excel筛选排序从小到大_(Excel)常用函数公式及操作技巧之三:排名及排序筛选(一)...
  9. I Sold Out for the Cash - 2022/8/10
  10. 伽罗华域, 二维码和CRC
  11. dfs序+线段树--青出于蓝胜于蓝
  12. Android 手机号输入格式化 3-3-4
  13. c语言高精度算法(加法)
  14. win7 修复计算机无法进入系统,win7系统下启动修复无法正常进入系统的解决方法...
  15. 互联网运营是青春饭吗?老运营告诉你答案
  16. c语言10以内四则运算,C语言-四则运算
  17. 企业服务器托管比租用有哪些优势
  18. 图像质量评价数据库与图像质量算法性能评价指标
  19. 使用Conda Pack打包Python独立运行时环境
  20. Jason高度计-波形重跟踪tips

热门文章

  1. Redis缓存(三)缓存异常的四个方面:数据同步、缓存雪崩、击穿、穿透
  2. html sql 编辑器,【web】CodeMirror打造SQL在线编辑器
  3. Python爬虫—手机销量
  4. [学习笔记-FPGA]Vivado出现信号差分问题
  5. 《老男孩》——记录我们逝去的青春
  6. Serenity框架官方文档翻译3.2(多租户)
  7. 信息安全实验四:RSA公钥加密算法 2019.04.28
  8. POJ 1625 Censored! (AC自动机 + 高精度 + DP)
  9. mumu显示连接服务器超时,网易mumu模拟器安装不了 网易mumu模拟器安装好久解决方法...
  10. 网易mumu模拟器去广告纯净版 v1.26.1.1