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. 微软职位内部推荐-Senior Software Engineer-SDP

    微软近期Open的职位: Position: Senior SDE The R&D of Shared Data Platform at Application and Services Gr ...

  2. 微软职位内部推荐-SR DEV

    微软近期Open的职位: JD 如果你想试试这个职位,请跟我联系,我是微软的员工,可以做内部推荐.发你的中英文简历到我的邮箱:Nicholas.lu.mail(at)gmail.com

  3. Notes of the scrum meeting(11/4)

    meeting time:20:00~20:30p.m.,November 4th,2013 meeting place:20号公寓楼前 attendees: 顾育豪                  ...

  4. 团队开发——SCRUM报告(一)

    一.成员介绍 队长:胡亚宝 PM:曹美娜 成员:焦燕.袁亚姣.黄亚萍 二.sprint会议 由于之前是一五一小长假,所以距离上次会议中间隔了很长时间,这里在对上次会议做一下简单的汇总 在上次会议上我们 ...

  5. 程序开发心理学阅读笔记——第I篇

    1.软件的任务是为了解决某一特定的问题,而软件开发者的任务却需要解决一系列问题.2.温伯格说,我们不能要求每个人都聪明异常,能够解决所有难题:但是我们必须持续思考,因为只有如此,我们才能明白自己在做什 ...

  6. python-转换成exe文件(py2exe)

    一.简介: py2exe是一个将python脚本转换成windows上的可独立执行的可执行程序(*.exe)的工具,这样,你就可以不用装python而在windows系统上运行这个可执行程序.py2e ...

  7. Python 文件读和写

  8. 【LCA】CodeForce #326 Div.2 E:Duff in the Army

    C. Duff in the Army Recently Duff has been a soldier in the army. Malek is her commander. Their coun ...

  9. 【HDOJ】【3480】Division

    DP/四边形不等式 要求将一个可重集S分成M个子集,求子集的极差的平方和最小是多少…… 首先我们先将这N个数排序,容易想到每个自己都对应着这个有序数组中的一段……而不会是互相穿插着= =因为交换一下明 ...

  10. 【BZOJ】【1177】【APIO2009】Oil

    DP 找出三个正方形,可以转化为将整个油田切成三个矩形块,每块中各找一个正方形区域,切的形式只有6种,分类更新ans即可 题解:http://trinklee.blog.163.com/blog/st ...