1. BOOL SaveHwndToBmpFile(HWND hWnd, LPCTSTR lpszPath)
  2. {
  3. HWND hDesktop = ::GetDesktopWindow();
  4. ASSERT(hDesktop);
  5. if(NULL == hWnd)
  6. {
  7. hWnd = hDesktop;
  8. }
  9. RECT rect;
  10. ::GetWindowRect(hWnd, &rect);
  11. int nWidht = rect.right - rect.left;
  12. int nHeight = rect.bottom - rect.top;
  13. HDC hSrcDC = ::GetWindowDC(hWnd);
  14. ASSERT(hSrcDC);
  15. HDC hMemDC = ::CreateCompatibleDC(hSrcDC);
  16. ASSERT(hMemDC);
  17. HBITMAP hBitmap = ::CreateCompatibleBitmap(hSrcDC, nWidht, nHeight);
  18. ASSERT(hBitmap);
  19. HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMemDC, hBitmap);
  20. ::BitBlt(hMemDC, 0, 0, nWidht, nHeight, hSrcDC, 0, 0, SRCCOPY);
  21. BITMAP bitmap = {0};
  22. ::GetObject(hBitmap, sizeof(BITMAP), &bitmap);
  23. BITMAPINFOHEADER bi = {0};
  24. BITMAPFILEHEADER bf = {0};
  25. CONST int nBitCount = 24;
  26. bi.biSize = sizeof(BITMAPINFOHEADER);
  27. bi.biWidth = bitmap.bmWidth;
  28. bi.biHeight = bitmap.bmHeight;
  29. bi.biPlanes = 1;
  30. bi.biBitCount = nBitCount;
  31. bi.biCompression = BI_RGB;
  32. DWORD dwSize = ((bitmap.bmWidth * nBitCount + 31) / 32) * 4 * bitmap.bmHeight;
  33. HANDLE hDib = GlobalAlloc(GHND, dwSize + sizeof(BITMAPINFOHEADER));
  34. LPBITMAPINFOHEADER lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
  35. *lpbi = bi;
  36. ::GetDIBits(hMemDC, hBitmap, 0, bitmap.bmHeight, (BYTE*)lpbi + sizeof(BITMAPINFOHEADER), (BITMAPINFO*)lpbi, DIB_RGB_COLORS);
  37. try
  38. {
  39. CFile file;
  40. file.Open(lpszPath, CFile::modeCreate | CFile::modeWrite);
  41. bf.bfType = 0x4d42;
  42. dwSize += sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  43. bf.bfSize = dwSize;
  44. bf.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
  45. file.Write((BYTE*)&bf, sizeof(BITMAPFILEHEADER));
  46. file.Write((BYTE*)lpbi, dwSize);
  47. file.Close();
  48. }
  49. catch(CFileException* e)
  50. {
  51. e->ReportError();
  52. e->Delete();
  53. }
  54. GlobalUnlock(hDib);
  55. GlobalFree(hDib);
  56. ::SelectObject(hMemDC, hOldBitmap);
  57. ::DeleteObject(hBitmap);
  58. ::DeleteDC(hMemDC);
  59. ::ReleaseDC(hWnd, hSrcDC);
  60. return TRUE;
  61. }
  62. // 调用方法
  63. HWND hWnd = ::FindWindow(NULL, _T("XXX"));
  64. if(hWnd)
  65. {
  66. SaveHwndToBmpFile(hWnd, _T("F://12.bmp"));
  67. }

http://blog.csdn.net/visualeleven/article/details/6202796

http://blog.csdn.net/visualeleven/article/details/6206715

http://blog.csdn.net/visualeleven/article/details/6093484

窗口截图(可指定HWND窗口句柄)(三篇文章)的更多相关文章

  1. 三篇文章了解 TiDB 技术内幕 —— 谈调度

    任何一个复杂的系统,用户感知到的都只是冰山一角,数据库也不例外. 前两篇文章介绍了 TiKV.TiDB 的基本概念以及一些核心功能的实现原理,这两个组件一个负责 KV 存储,一个负责 SQL 引擎,都 ...

  2. TIDB4 —— 三篇文章了解 TiDB 技术内幕 - 谈调度

    原文地址:https://pingcap.com/blog-cn/tidb-internal-3/ 为什么要进行调度 先回忆一下第一篇文章提到的一些信息,TiKV 集群是 TiDB 数据库的分布式 K ...

  3. jq最新前三篇文章高亮显示

    /*---------最新前三篇文章高亮显示-------------*/ function latest(){ var color_arr=new Array( "blue", ...

  4. 三篇文章带你极速入门php(三)之php原生实现登陆注册

    看下成果 ps:纯天然h5,绝不添加任何添加剂(css)以及化学成分(js)(<( ̄ ﹌  ̄)我就是喜欢纯天然,不接受任何反驳) 关于本文 用原生的php和html做了一个登陆注册,大概是可以窥 ...

  5. 三篇文章了解 TiDB 技术内幕——说计算

    在这我们将关系模型简单理解为 Table 和 SQL 语句,那么问题变为如何在 KV 结构上保存 Table 以及如何在 KV 结构上运行 SQL 语句. 假设我们有这样一个表的定义: CREATE ...

  6. 三篇文章了解 TiDB 技术内幕 - 说存储(转)

    引言 数据库.操作系统和编译器并称为三大系统,可以说是整个计算机软件的基石.其中数据库更靠近应用层,是很多业务的支撑.这一领域经过了几十年的发展,不断的有新的进展. 很多人用过数据库,但是很少有人实现 ...

  7. 分析RAC下一个SPFILE整合的三篇文章的文件更改

    大约RAC下一个spfile分析_整理在_2014.4.17 说明:文章来源于网络 第一篇:RAC下SPFILE文件改动 在RAC下spfile位置的改动与单节点环境不全然一致,有些地方须要特别注意, ...

  8. C++ crash 堆栈信息获取(三篇文章)

    最近在做程序异常时堆栈信息获取相关工作,上一篇文章成功的在程序creash时写下了dump文件,而有些情况写dump文件是 不可以的,比如在jni开发时,C++只做底层处理,而整个项目是android ...

  9. TIDB3 —— 三篇文章了解 TiDB 技术内幕 - 说计算

    原文地址:https://pingcap.com/blog-cn/tidb-internal-2/ 关系模型到 Key-Value 模型的映射 在这我们将关系模型简单理解为 Table 和 SQL 语 ...

随机推荐

  1. JAVA类与对象(五)----对象的生成、使用

    对象的生成 创建一个对象包括对象的声明.实例化.初始化三部分. 1.声明-----类名对象名 声明并不是为对象分配内存空间,而只是分配一个引用空间.对象的引用类似于指针,是32位的地址空间,它的值指向 ...

  2. cocos2dx中帧循环的伪代码实现

    1.在游戏开发中,帧率很大程度上体现了游戏的流畅度,帧循环是游戏中一个很重要的概念 2.下面用伪代码实现了cocos2dx中的帧循环 /*main函数调用*/ CCApplication::share ...

  3. MSSQL Transaction[事务] and Procedure[存储过程]

    --事务分三种 --1.显示事务 --我们手动begin transaction ...... commit transaction/rollback transaction --上面这种写法叫做“显 ...

  4. Android -- 获取摄像头帧数据解码

    由于Android下摄像头预览数据只能  ImageFormat.NV21 格式的,所以解码时要经过一翻周折. Camera mCamera = Camera.open(); Camera.Param ...

  5. 搭建SpringMVC+MyBatis开发框架四

    在src/main下面新建一个resouces文件夹,我们继续配置一些资源 1.新增applicationContext.xml:  <?xml version="1.0" ...

  6. EasyUI 在aspx页面显示高度不正常解决办法

    <body class="easyui-layout"> <form id="form1" runat="server"& ...

  7. Javascript对象的创建模式 -- 深入了解Javascript

    /* 一.模式1:命名空间(namespace) 优点:减少全局命名所需的数量,避免命名冲突或过度 */ // 更简洁的方式 var MYAPP = MYAPP || {}; //定义通用方法 MYA ...

  8. Java多线程时内存模型

    1. 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标之一.一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题 ...

  9. BZOJ2039 [2009国家集训队]employ人员雇佣

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=2039 鉴于一开始看题如果不仔细是看不懂题目的,还是说一下题目大意 [题目大意]:给定n个人 ...

  10. 【BZOJ】【4010】【HNOI2015】菜肴制作

    拓扑排序 这题是要求N个点的一个拓扑序,且满足以下条件:编号1的位置尽可能靠前,在此基础上编号2的位置尽可能靠前…… 我看到这题的第一感觉:将拓扑排序用的队列改为优先队列,编号越小越早出来. 但是连样 ...