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. 数据库的编码浅谈(ZHS16GBK与US7ASCII)

     数据库的编码浅谈(ZHS16GBK与US7ASCII) 2007-11-15 17:14:18 分类: Oracle SQL> SELECT RAWTOHEX('郭A军') from dual ...

  2. c判断括弧是否匹配

    这里我没有用堆栈.直接用一个数组input[SIZE]接收用户的输入,在遍历数组,对数组进行操作.已经匹配好的括弧直接用#号覆盖,最后遍历数组.如果数组只有#号,没有其他元素,则匹配.否则不匹配. / ...

  3. JavaEDU614 团队第三周项目总结

    JavaEDU614 团队第三周项目总结 本周,根据项目计划完成模块的设计代码 本项目主要是完成俄罗斯方块的基本操作.用户可以自己练习和娱乐.需要满足以下几点要求. (1)界面控制游戏开始.暂停和结束 ...

  4. 尝试用Uplodify

    尝试用Uplodify     Uplodify官方 前台index代码: @{ Layout = null; } <script src="~/Scripts/jquery-1.8. ...

  5. Python使用SMTP发送邮件[HTML格式、送带附件]

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. python的smtplib提供了一 ...

  6. Nginx问题总汇

    http://blog.csdn.net/llnara/article/details/8691049 关键字: open var run nginx pid failed 产生原因:添加模块,重编译 ...

  7. FastDFS配置文件(tracker.conf)

    # ===========================基本配置==================================== # 该配置文件是否生效 # false:生效 # true: ...

  8. 项目前端技术-learn

    赶鸭子上架 之 前端学习 目前项目中的前端用到的技术主要是:1. bootstrap框架; 2. 基于javscript的jQuery, jQuery ui; 3. dust前端模板引型.

  9. iOS开发之runtime的运用-获取当前网络状态

    之前写过runtime的一些东西,这次通过runtime获取一些苹果官方不想让你拿到的东西,比如,状态栏内部的控件属性.本文将通过runtime带你一步步拿到状态栏中显示网络状态的控件,然后通过监测该 ...

  10. WCF服务端与客户端时间匹配问题

    当服务端部署的WCF服务服务在被客户机调用时,如果显示: 错误,展开后,详细错误为:An error occurred when verifying security for the message ...