# 项目学习_spy截图软件 **Repository Path**: maffy/project-based-learning ## Basic Information - **Project Name**: 项目学习_spy截图软件 - **Description**: 学习Github项目 - **Primary Language**: C++ - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-03-23 - **Last Updated**: 2023-03-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目学习 #### 介绍 学习Github项目
##### MFC系列:
MFC_spy截图软件
# spy截图工具 MFC框架练手的项目 目的是:熟悉MFC框架内部 功能: 1.可以进行截图 2.可以进行滚动的长截图 ## 注意 无法获取网页性质页面的图片 ## 具体流程 实现一个CWnd类对屏幕进行获取DC,采用CVector对img进行保存。 类管理采用智能指针shared_ptr 难点解决思路: 判断是否截图完成 * 滚动条的思路:难点是无法判断滚动条是父类的还是自己的 * 图片思路:关键是对2个图片的Data部分相似度判断,注意在GetBites指向的是最后一行,需要对指针进行修正。 公式是 ``` int *pBMPData=(int *)img.GetBites()-(img.Height()-1)*img.Width(); ``` * 图片拼接: 要注意先保存在获取数据,最后创建一个大图片进行补充。 注意CImage类 ## 详细说明 在CspyDlg类中通过类向导新建可以响应MM_CAPTURE消息的函数 模拟鼠标点击,边下滑边截图这里实现采用 ``` void CspyDlg::Capture(HWND hwndDst) { ShowWindow(SW_HIDE); POINT pt; ::GetCursorPos(&pt); //模拟鼠标点击 mouse_event(MOUSEEVENTF_LEFTDOWN, pt.x, pt.y, 0, 0); mouse_event(MOUSEEVENTF_LEFTUP, pt.x, pt.y, 0, 0); Sleep(1000); std::vector> lstImgs; HDC hdcDst = ::GetDC(hwndDst); CRect rc; ::GetClientRect(hwndDst, &rc); while (1) { std::shared_ptr ptrImg(new CImage); ptrImg->Create(rc.Width(), rc.Height(), 32); HDC hdcImg = ptrImg->GetDC(); ::BitBlt(hdcImg, 0, 0, rc.Width(), rc.Height(), hdcDst, 0, 0, SRCCOPY); ptrImg->ReleaseDC(); //保存 lstImgs.push_back(ptrImg); //滚动到下一屏 keybd_event(VK_NEXT, 0, 0, 0); //按下 keybd_event(VK_NEXT, 0, KEYEVENTF_KEYUP, 0); //弹起 if (lstImgs.size() > 1 ) { if (CmpBitBMP(lstImgs[lstImgs.size()-2], lstImgs[lstImgs.size()-1], rc)) { break; } } Sleep(500); } //截图完毕,拼接大图 CImage imgBig; imgBig.Create(rc.Width(), rc.Height()*lstImgs.size(), 32); HDC hdcBig = imgBig.GetDC(); int nIdx = 0; for (auto ptrImg:lstImgs) { //拷贝图片数据 HDC hdc = ptrImg->GetDC(); ::BitBlt(hdcBig, 0, rc.Height()*nIdx, rc.Width(), rc.Height(), hdc, 0, 0, SRCCOPY); ptrImg->ReleaseDC(); ++nIdx; } imgBig.ReleaseDC(); imgBig.Save("1.png"); ShowWindow(SW_SHOW); } ```