前面几篇文章介绍了如何进行窗口截图并保存至剪切板,现在将完整的代码贴出来:

主要是两个文件:( 完整源代码:http://download.csdn.net/detail/wwkaven/7487915 )

// 123Dlg.cpp : implementation file
//#include "stdafx.h"
#include "123.h"
#include "123Dlg.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endifHWND My123Hwnd;
HWND cutWnd;/
// CMy123Dlg dialogCMy123Dlg::CMy123Dlg(CWnd* pParent /*=NULL*/): CDialog(CMy123Dlg::IDD, pParent)
{//{{AFX_DATA_INIT(CMy123Dlg)// NOTE: the ClassWizard will add member initialization here//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CMy123Dlg::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CMy123Dlg)// NOTE: the ClassWizard will add DDX and DDV calls here//}}AFX_DATA_MAP
}BEGIN_MESSAGE_MAP(CMy123Dlg, CDialog)//{{AFX_MSG_MAP(CMy123Dlg)ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_TIMER()//}}AFX_MSG_MAP
END_MESSAGE_MAP()/
// CMy123Dlg message handlersBOOL CMy123Dlg::OnInitDialog()
{CDialog::OnInitDialog();// Set the icon for this dialog.  The framework does this automatically//  when the application's main window is not a dialogSetIcon(m_hIcon, TRUE);          // Set big iconSetIcon(m_hIcon, FALSE);     // Set small icon// TODO: Add extra initialization herem_pic.SubclassDlgItem(IDC_PIC,this);  // 关联控件My123Hwnd = m_hWnd;  // 赋值return TRUE;  // return TRUE  unless you set the focus to a control
}// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.void CMy123Dlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}
}// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CMy123Dlg::OnQueryDragIcon()
{return (HCURSOR) m_hIcon;
}void CMy123Dlg::OnTimer(UINT nIDEvent)
{// TODO: Add your message handler code here and/or call defaultif (1 == nIDEvent) {POINT pnt;RECT rc;HWND DeskHwnd = ::GetDesktopWindow(); //取得桌面句柄HDC DeskDC = ::GetWindowDC(DeskHwnd); //取得桌面设备场景int oldRop2 = SetROP2(DeskDC, R2_NOTXORPEN);::GetCursorPos(&pnt); //取得鼠标坐标HWND UnHwnd = ::WindowFromPoint(pnt) ; //取得鼠标指针处窗口句柄::GetWindowRect(UnHwnd, &rc); //获得窗口矩形cutWnd = UnHwnd;if( rc.left < 0 ) rc.left = 0;if (rc.top < 0 ) rc.top = 0;HPEN newPen = ::CreatePen(PS_SOLID, 3, RGB(255, 0, 0)); //建立新画笔,载入DeskDCHGDIOBJ oldPen = ::SelectObject(DeskDC, newPen);::Rectangle(DeskDC, rc.left, rc.top, rc.right, rc.bottom); //在窗口周围显示闪烁矩形Sleep(400); //设置闪烁时间间隔::Rectangle( DeskDC, rc.left, rc.top, rc.right, rc.bottom);::SetROP2(DeskDC, oldRop2);::SelectObject( DeskDC, oldPen);::DeleteObject(newPen);::ReleaseDC( DeskHwnd, DeskDC);DeskDC = NULL;}if (2 == nIDEvent) {if (m_pic.GetIsFinshed()) {CopyBitmapToClipboard(FromHandle(cutWnd), TRUE);}}CDialog::OnTimer(nIDEvent);
}void CMy123Dlg::CopyBitmapToClipboard(CWnd *wnd, BOOL FullWnd)
{CDC *dc;if(FullWnd){ /* 抓取整个窗口*/dc = new CWindowDC(wnd);}      else{ /* 仅抓取客户区时*/dc = new CClientDC(wnd);} CDC memDC;memDC.CreateCompatibleDC(dc);CBitmap bm;CRect r;if(FullWnd)wnd->GetWindowRect(&r);elsewnd->GetClientRect(&r);CString s;wnd->GetWindowText(s);CSize sz(r.Width(), r.Height());bm.CreateCompatibleBitmap(dc, sz.cx, sz.cy);CBitmap * oldbm = memDC.SelectObject(&bm);memDC.BitBlt(0, 0, sz.cx, sz.cy, dc, 0, 0, SRCCOPY);//直接调用OpenClipboard(),而不用wnd->GetParent()->OpenClipboard();wnd->OpenClipboard();::EmptyClipboard();::SetClipboardData(CF_BITMAP, bm.m_hObject);CloseClipboard();//恢复原始环境memDC.SelectObject(oldbm);bm.Detach();  delete dc;KillTimer(2);// 加一句提示MessageBox(_T("复制完成"));}
// MyPic.cpp : implementation file
//#include "stdafx.h"
#include "123.h"
#include "MyPic.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/
// CMyPicCMyPic::CMyPic()
{
}CMyPic::~CMyPic()
{
}BEGIN_MESSAGE_MAP(CMyPic, CStatic)//{{AFX_MSG_MAP(CMyPic)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()//}}AFX_MSG_MAP
END_MESSAGE_MAP()/
// CMyPic message handlersvoid CMyPic::OnLButtonDown(UINT nFlags, CPoint point)
{// TODO: Add your message handler code here and/or call defaultSetCapture(); // 鼠标捕获HCURSOR hc = LoadCursor(AfxGetApp()->m_hInstance, MAKEINTRESOURCE (IDC_CURSOR1)); //IDC_CURSOR1是靶形光标资源号::SetCursor(hc);HICON hicon2 = LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE (IDI_ICON2)); //IDI_ICON2为无靶图标资源号this->SetIcon(hicon2);FromHandle(My123Hwnd)->SetTimer(1,600,NULL);IsFinshed = false;CStatic::OnLButtonDown(nFlags, point);
}void CMyPic::OnLButtonUp(UINT nFlags, CPoint point)
{// TODO: Add your message handler code here and/or call defaultReleaseCapture(); //释放鼠标捕获HICON hicon1 = LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE (IDI_ICON1)); //IDI_ICON1是有靶图标资源号this->SetIcon(hicon1);IsFinshed = true;FromHandle(My123Hwnd)->KillTimer(1);FromHandle(My123Hwnd)->SetTimer(2, 600, NULL);CStatic::OnLButtonUp(nFlags, point);
}bool CMyPic::GetIsFinshed()
{return IsFinshed;
}

但是,完成后效果并不是很好,因为win7Aero特效的原因,有些窗口截图失败,Ctrl + V后是一块黑,或是背景为一块黑,见图:

正常应该是这样的:

当然,大部分窗口是正常的:

MFC截图程序的实现(四)相关推荐

  1. MFC截图程序的实现(一)

    最近,想自己写个独立的截图程序,网上看了很多资料,大致都一般无二,实现起来也有不少不足之处.最后,还是写了一些实验性的程序,现在贴出来: 以下是我的几点理解: 1.截图,顾名思义,即是将屏幕的某一部分 ...

  2. MFC截图程序的实现(五)

    上篇所讲的程序,造成截图不正确的原因显然是CopyBitmapToClipboard这个函数.关于这个函数这里就先不提了, 后面会具体讲. 现在的问题是:如果要使用许多截图,必须一一将截图先存成文件. ...

  3. MFC应用程序中添加控制台窗口

    在MFC程序中输出调试信息的方法有两种,一种是使用TRACE宏,可以向Output窗口输出调试信息:另一种是用MessageBox,弹出消息框来输出调试信息,但会影响程序的运行. 其实有一种方法可以更 ...

  4. MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应...

    MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文:  http://blog.csdn.net/supermanking/article/detail ...

  5. 基于VTK的MFC应用程序开发(3)

    基于VTK的MFC应用程序开发(3) 分类: VTK应用示例 2013-05-17 13:37 3307人阅读 评论(23) 收藏 举报 目录(?)[+] 之前介绍了基于VTK的单文档应用程序开发,并 ...

  6. 基于VTK的MFC应用程序开发(2)

    基于VTK的MFC应用程序开发(2) 分类: VTK应用示例 2013-03-29 13:03 6647人阅读 评论(18) 收藏 举报 MFCVTK图像重采样 目录(?)[+] 现在基于VTK的MF ...

  7. VS2010/MFC编程入门之四(MFC应用程序框架分析)

    上一讲鸡啄米讲的是VS2010应用程序工程中文件的组成结构,可能大家对工程的运行原理还是很模糊,理不出头绪,毕竟跟C++编程入门系列中的例程差别太大.这一节鸡啄米就为大家分析下MFC应用程序框架的运行 ...

  8. (转载)VS2010/MFC编程入门之四(MFC应用程序框架分析)

    上一讲鸡啄米讲的是VS2010应用程序工程中文件的组成结构,可能大家对工程的运行原理还是很模糊,理不出头绪,毕竟跟C++编程入门系列中的例程差别太大.这一节鸡啄米就为大家分析下MFC应用程序框架的运行 ...

  9. 《MFC游戏开发》笔记四 键盘响应和鼠标响应:让人物动起来

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9327377 作者:七十一雾央 新浪微博:http:// ...

最新文章

  1. Python break语句,continue语句,pass 语句
  2. ios打包ipa的四种实用方法
  3. 10个经典而简单的jQuery特效设计在线演示
  4. [轉]子窗口和父窗口的函数或对象能否相互访问
  5. 《PHP求职宝典》--Web设计页面笔记
  6. 从程序猿到SAP产品经理,我是如何转型的?
  7. 计算机一级应用于段落还是文字,计算机一级复习资料
  8. python每周小测验答案_python第一周小测验答案Centos下更新Python版本
  9. throw和throws的使用
  10. ARC077C pushpush 递推
  11. 存储控制器和SDRAM 实验
  12. 通向架构师的道路(第八天)之weblogic与apache的整合与调优 转
  13. 科学计算matlab尔雅答案,科学计算与MATLAB语言2019尔雅答案
  14. 利用webmagic爬去招聘信息,并输入到Hbase数据库中
  15. springboot easypoi excel导出功能
  16. 2016——大数据版图
  17. linux命令下jq的用法(curl 格式化输出json 字符串)
  18. 四川地区办理增值电信经营许可证
  19. 计算机卡登录界面,win10电脑卡在登录界面怎么办
  20. 黑客攻防与网络安全-N-0

热门文章

  1. 狼的故事8:生存就是坚持
  2. 杀戮地带2的渲染技术(Rendering_Technology_Of_Killzone_2)
  3. iPhone 系列壁纸,太好看了!
  4. 设计原则之里氏代换原则
  5. 放宽心,坚持住,一切都是最好的安排!
  6. OleDB Get SQL Server SmallDateTime type.
  7. 中小企业集成AI人工智能的窘境
  8. RNN—原理详解及股票预测实战
  9. 神经网络训练过程详解,神经网络的训练算法
  10. 反汇编是什么?就是把机器码转换成汇编语言吗? 有哪些反汇编工具(objdump)?反汇编用于解决哪些问题?