# 项目学习_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);
}
```