day12 – 滚动截图

本文介绍了一个C++程序,通过获取窗口坐标,捕捉窗口内容,并实时合并图片,记录滚动过程,最终生成连续截图序列。使用了GetCursorPos、WindowFromPoint、SetForegroundWindow等API,以及CDC和CImage类进行图像处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CPoint ptWnd;
	GetCursorPos(&ptWnd);
	CWnd* pWnd = WindowFromPoint(ptWnd);
	pWnd->SetForegroundWindow();

	CDC* pDc = pWnd->GetDC();

	int nBpp = pDc->GetDeviceCaps(BITSPIXEL);
	int tmpPos = 0;
	int n = 0;

	CImage img;
	CRect rc;
	pWnd->GetClientRect(&rc);
	img.Create(rc.Width(), rc.Height(), nBpp);

	while (true)
	{
		keybd_event(VK_NEXT, 0, 0, 0);
		keybd_event(VK_NEXT, 0, KEYEVENTF_KEYUP, 0);

		Sleep(500);

		SCROLLINFO si = {};
		si.cbSize = sizeof(si);
		si.fMask = SIF_ALL;
		pWnd->GetScrollInfo(SB_VERT, &si);

		if (tmpPos == si.nPos && tmpPos != 0)
		{
			break;
		}

		n += 1;

		CImage newImg;
		CImage tempImg;

		newImg.Create(rc.Width(), rc.Height(), nBpp);

		HDC hdc = newImg.GetDC();
		::BitBlt(hdc, 0, 0, rc.Width(), rc.Height(), pDc->m_hDC, 0, 0, SRCCOPY);

		if (n == 1)
		{
			HDC newhdc = img.GetDC();
			::BitBlt(newhdc, 0, 0, rc.Width(), rc.Height(), hdc, 0, 0, SRCCOPY);
			img.ReleaseDC();
		}
		else
		{
			tempImg.Create(rc.Width(), rc.Height() * (n - 1), nBpp);
			HDC newhdc = img.GetDC();
			HDC newHdc = tempImg.GetDC();
			::BitBlt(newHdc, 0, 0, rc.Width(), rc.Height() * (n - 1), newhdc, 0, 0, SRCCOPY);
			img.ReleaseDC();
			img.Destroy();
			img.Create(rc.Width(), rc.Height() * n, nBpp);
			newhdc = img.GetDC();
			::BitBlt(newhdc, 0, 0, rc.Width(), rc.Height() * (n - 1), newHdc, 0, 0, SRCCOPY);
			::BitBlt(newhdc, 0, rc.Height() * (n - 1), rc.Width(), rc.Height(), hdc, 0, 0, SRCCOPY);
			img.ReleaseDC();
			tempImg.ReleaseDC();
		}

		tmpPos = si.nPos;
		newImg.ReleaseDC();
	}

	img.Save(L"1.png");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值